2012-02-21 27 views
10

Tôi cần phải theo dõi những thay đổi (bổ sung và xóa) của một hiệp hội được thành lập như thế này:Rails 3 has_many đã thay đổi?

has_many :listing_services 
has_many :services, through: :listing_services 

Đối với thuộc tính bình thường cách easist để làm điều đó là để kiểm tra l.changes[attribute] trong before_save hoặc l.previous_changes[attribute] trong after_save.

Câu hỏi là, cách tốt nhất để làm điều đó cho thuộc tính has_many là gì?

Trả lời

16

Tôi không sử dụng phương thức changes. Nhưng tôi chắc chắn rằng bạn luôn có thể sử dụng phương pháp kỳ diệu <attribute_name>_changed?<attribute_name>_was:

services.any? {|s| s.attribute_name_changed?} 
services.map(&:attribute_name_was) 
railscast

Xem Ryan Bates cho biết thêm thông tin: #109 episode

CẬP NHẬT: Bạn có thể vượt qua :after_delete, và :after_add callbacks để has_many liên kết trực tiếp:

has_many :items, :after_add => :my_method_or_proc1, :after_remove => :my_method_or_proc2 

Be car eful bằng cách sử dụng các callbacks này và chú ý cách chúng hoạt động. Họ được gọi trên items.builditems.createsau khi. Vì vậy, nếu bạn gọi items.build và sau đó lưu đối tượng cha mẹ (với các thuộc tính lồng nhau cho chẳng hạn) after_add callback sẽ được gọi là một lần duy nhất vào việc xây dựng liên quan đến đối tượng. Điều đó có nghĩa là nếu cha mẹ có xác thực thì việc xây dựng items sẽ không được lưu trong cơ sở dữ liệu và bạn không thể dựa vào số gọi lại after_add. Nói cách khác, nó không nói rằng bản ghi của hiệp hội được thêm vào đã được lưu trong DB. Vì vậy, bạn có đảm bảo rằng mục được thêm vào và chỉ được lưu trên cuộc gọi items.create. Tôi hy vọng bạn hiểu rõ điều này.

+0

Đối với tôi, tính năng này chỉ hoạt động, nếu đối tượng được liên kết được cập nhật. Nó không làm việc cho tôi, nếu đối tượng liên kết được thêm vào hoặc bị loại bỏ (vì nó không còn tồn tại trong liên kết 'services') nữa. Tôi đang làm gì sai? – morgler

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