2009-03-31 26 views
6

Tôi có một mô hình ActiveRecord với cột trạng thái. Khi mô hình được lưu với thay đổi trạng thái, tôi cần ghi vào tệp lịch sử thay đổi trạng thái và ai chịu trách nhiệm về thay đổi. Tôi đã nghĩ rằng một cuộc gọi lại after_save sẽ làm việc tuyệt vời, nhưng tôi không thể sử dụng status_changed? phương pháp động để xác định rằng ghi lịch sử là cần thiết để thực thi. Tôi không muốn viết vào lịch sử nếu mô hình được lưu nhưng trạng thái không thay đổi. Ý nghĩ duy nhất của tôi về xử lý nó ngay bây giờ là sử dụng một cờ biến thể hiện để xác định xem after_save có nên thực hiện hay không. Bất kỳ ý tưởng?Rails after_save gọi lại để tạo mô hình liên quan dựa trên column_changed?

Trả lời

0

tôi thấy hai giải pháp:

  1. Giống như bạn nói: thêm một lá cờ khác nhau và chạy callback khi nó được thiết lập.

  2. Chạy save_history sau khi cập nhật hồ sơ của bạn.

Ví dụ:

old_status = @record.status 
if @record.update\_attributes(params[:record]) 
    save_history_here if old_status != @record.status 
    flash[:notice] = "Successful!" 
    ... 
else 
    ... 
end 
6

Sử dụng một callback before_save để thay thế. Sau đó, bạn có quyền truy cập vào cả giá trị trạng thái mới và cũ. Callbacks được gói trong một giao dịch, vì vậy nếu lưu không thành công hoặc bị hủy bỏ bởi một cuộc gọi lại khác, ghi lịch sử cũng sẽ được khôi phục.

10

Điều này có thể đã thay đổi kể từ khi câu hỏi đã được đăng, nhưng gọi lại after_save nên có *_changed? phương pháp năng động sẵn có và thiết lập một cách chính xác:

class Order 
    after_save :handle_status_changed, :if => :status_changed? 
end 

hoặc

class Order 
    after_save :handle_status_changed 
    def handle_status_changed 
    return unless status_changed? 
    ... 
    end 
end 

trình một cách chính xác đối với tôi w/Đường ray 2.3.2.

-6

Có ai không nghe nói về trình kích hoạt cơ sở dữ liệu không? Nếu bạn viết trình kích hoạt cơ sở dữ liệu on_update trên máy chủ cơ sở dữ liệu, thì mỗi khi bản ghi được cập nhật, nó sẽ tạo bản sao lịch sử các giá trị của bản ghi trước đó trong bảng kiểm toán được liên kết.

Đây là một trong những điều chính tôi coi thường về Rails. Nó dành rất nhiều thời gian để cố gắng làm mọi thứ cho nhà phát triển, nó khiến các nhà phát triển nghĩ rằng họ phải tuân theo những hành động thô tục như viết các phương pháp ray chuyên dụng để làm những gì máy chủ cơ sở dữ liệu freaking đã hoàn toàn có khả năng tự làm tất cả.

lắc đầu tại Rails một lần nữa

+0

Nếu bạn có thể chỉ cho tôi làm thế nào để tạo ra một cơ sở dữ liệu ghi kích hoạt vào một tập tin bản ghi lịch sử, tôi sẽ upvote bạn. – Georges

+0

Tại sao một trình kích hoạt cơ sở dữ liệu bao giờ ghi vào một tệp nhật ký? Mục đích duy nhất của một kích hoạt, trong trường hợp này, phục vụ như một bản ghi hoạt động lịch sử trên bảng kích hoạt được viết cho. Đăng nhập vào một tập tin là trách nhiệm của một ứng dụng. Tôi bắt đầu nghĩ rằng có một thiếu cơ bản về hiểu hệ thống cơ bản. Nhưng, chúng ta đang nói về Rails. Vì vậy, tôi đoán rằng giải thích "làm tất cả mọi thứ mà không biết tại sao" tâm lý. Không có tội, Georges. Nhưng Rails là một sự đảo lộn của lập trình thông thường ở mức tốt nhất. – Skittles

+0

Ah, xin lỗi. Tôi đoán ban đầu tôi đã đọc nhận xét của bạn vì nhận xét ban đầu đã đề cập đến một tệp * lịch sử *. Bạn nói đúng. Bảng kiểm tra và trình kích hoạt tốt hơn nhiều trong trường hợp này. Được thăng hạng. – Georges

Các vấn đề liên quan