我需要跟踪设置的关联的更改(添加和删除),如下所示:
has_many :listing_services
has_many :services, through: :listing_services
对于普通属性,最简单的方法是检查l.changes[attribute]
中的before_save
或l.previous_changes[attribute]
中的after_save
。
问题是,为has_many
属性执行此操作的最佳方式是什么?
答案 0 :(得分:16)
我没有使用changes
方法。但我确信你总能使用魔术方法<attribute_name>_changed?
和<attribute_name>_was
:
services.any? {|s| s.attribute_name_changed?}
services.map(&:attribute_name_was)
有关更多信息,请参阅Ryan Bates的railscast:#109 episode
更新:您可以直接将:after_delete
和:after_add
个回调传递给has_many
关联:
has_many :items, :after_add => :my_method_or_proc1, :after_remove => :my_method_or_proc2
小心使用这些回调并注意它们的工作原理。他们
在items.build
和items.create
上调用。所以,如果你打电话
items.build
然后保存父对象(具有嵌套属性)
示例)after_add
回调将仅在构建时调用一次
相关对象。这意味着如果父进行验证,则构建的items
将不会保存在数据库中,您不能依赖after_add
回调。换句话说,它没有说添加的关联记录已保存在数据库中。因此,您可以保证仅在通话items.create
时添加和保存该项目。我希望你能理解这一澄清。