关于ruby:Rails 3 has_many改变了吗?

Rails 3 has_many changed?

我需要跟踪这样设置的关联的更改(添加和删除):

1
2
has_many :listing_services
has_many :services, through: :listing_services

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

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


我没有使用changes方法。但是我确定您总是可以使用魔术方法_changed?_was

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

有关更多信息,请参见Ryan Bates的详细信息:#109集

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

1
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上添加和保存该项目。希望您理解此说明。