Rails 3 has_many改变了吗?

gle*_*ebm 10 ruby activerecord ruby-on-rails has-many ruby-on-rails-3

我需要跟踪设置的关联的更改(添加和删除),如下所示:

has_many :listing_services
has_many :services, through: :listing_services
Run Code Online (Sandbox Code Playgroud)

对于普通属性,最简单的方法是签l.changes[attribute]before_save或签l.previous_changes[attribute]after_save.

问题是,为has_many属性执行此操作的最佳方法是什么?

ka8*_*725 16

我没有使用changes方法.但我相信你总是可以使用魔术方法<attribute_name>_changed?<attribute_name>_was:

services.any? {|s| s.attribute_name_changed?}
services.map(&:attribute_name_was)
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅Ryan Bates的railscast:#109剧集

更新:您可以直接传递:after_delete:after_add回调has_many关联:

has_many :items, :after_add => :my_method_or_proc1, :after_remove => :my_method_or_proc2
Run Code Online (Sandbox Code Playgroud)

小心使用这些回调并注意它们的工作原理.他们被称为上items.builditems.create 一次.因此,如果您调用 items.build然后保存父对象(例如,使用嵌套属性),则仅在构建关联对象时调用一次after_add回调.这意味着如果父进行验证,那么构建将不会保存在数据库中,您不能依赖回调.换句话说,它没有说添加的关联记录已保存在数据库中.因此,您可以保证仅在通话时添加和保存项目.我希望你理解这个澄清.itemsafter_additems.create