2012-02-21 35 views
10

我需要跟踪的更改(添加和删除)成立这样一个协会:Rails 3 has_many已更改?

has_many :listing_services 
has_many :services, through: :listing_services 

对于普通属性easist办法做到这一点是检查l.changes[attribute]before_savel.previous_changes[attribute]after_save

问题是,has_many属性的最佳做法是什么?

回答

16

我没有用changes的方法。但我敢肯定,你总是可以用魔术方法<attribute_name>_changed?<attribute_name>_was

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

见瑞恩·贝茨的railscast了解更多信息:#109 episode

UPDATE:你可以通过:after_delete:after_add回调has_many直接关联:

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

Be car充分利用这些回调并注意它们的工作方式。他们 被称为items.builditems.create一旦。所以,如果你 items.build然后保存父对象(嵌套属性为 例如)after_add回调将建设 关联对象只能调用一次。这意味着,如果父母有验证,那么内置的items将不会保存在数据库中,您不能依靠after_add回调。换句话说,它并没有说在数据库中保存了添加的关联记录。因此,您必须保证该物品仅在呼叫items.create上添加和保存。我希望你了解这个澄清。

+0

对我来说,这只适用于,如果关联的对象更新。如果添加或删除了关联的对象,它就不适用于我(因为它不再存在于“服务”关联中)。我究竟做错了什么? – morgler 2017-03-15 14:13:35