Rails 3 has_many改变了吗?

时间:2012-02-21 18:03:48

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord has-many

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

has_many :listing_services
has_many :services, through: :listing_services

对于普通属性,最简单的方法是检查l.changes[attribute]中的before_savel.previous_changes[attribute]中的after_save

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

1 个答案:

答案 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.builditems.create 上调用。所以,如果你打电话 items.build然后保存父对象(具有嵌套属性) 示例)after_add回调将仅在构建时调用一次 相关对象。这意味着如果父进行验证,则构建的items将不会保存在数据库中,您不能依赖after_add回调。换句话说,它没有说添加的关联记录已保存在数据库中。因此,您可以保证仅在通话items.create时添加和保存该项目。我希望你能理解这一澄清。