tôi có thể thấy một vài cách khác nhau. Tôi nghĩ rằng điều tốt nhất là thêm một trường khác vào bảng có tên là lifecycle_id_original
. Sau đó, mô hình của bạn sẽ bao gồm mã như thế này:
class Member < ActiveRecord::Base
belongs_to :lifecycle
validates :lifecycle_change_reason, :if => :lifecycle_changed?
before_save :reset_original_lifecycle
protected
def lifecycle_changed?
self.life_cycle_id != self.lifecycle_id_original && !self.lifecycle_id_original.nil?
end
def reset_original_lifecycle
self.lifecycle_id_original = self.lifecycle_id
end
end
Khi đối tượng (thành viên trong ví dụ này) được xác nhận, lifecycle_change_reason sẽ chỉ được yêu cầu khi bản gốc và lifecycle_id là không giống nhau. Giá trị nil cũng được phép cho giá trị gốc, bởi vì đó là những gì nó sẽ là khi một bản ghi mới được tạo ra.
Sau đó, khi được lưu, "gốc" được đặt để khớp với vòng đời, vì vậy chu kỳ cập nhật tiếp theo sẽ hoạt động bình thường.
Điều này không sạch như tôi muốn. Suy nghĩ đầu tiên của tôi là sử dụng attr_accessor
để bản sao không được lưu trữ trong DB tất cả các thời gian, nhưng điều đó sẽ có nghĩa là thiết lập giá trị đó mỗi khi một bản ghi được tải. Tôi không biết về bất kỳ callback kiểu on_load nào cho các mô hình ActiveRecord.
Nguồn
2010-01-18 16:07:52
vấn đề với điều này là bạn không nhận được tất cả các xác nhận lỗi thoải mái xử lý trong hình thức. –
Chắc chắn bạn cũng biết cách thực hiện điều đó: @ object.errors.add (: life_cycle_change_reason, "phải được cung cấp.") Đơn giản. – adriandz