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.build和items.create上被调用一次。所以如果你打电话
items.build,然后保存父对象(具有嵌套属性
示例)after_add回调仅在构建时被调用一次
相关对象。这意味着,如果父级进行了验证,则内置的items将不会保存在数据库中,并且您将无法依赖after_add回调。换句话说,这并不是说添加的关联记录已保存在数据库中。因此,您可以确保仅在呼叫items.create上添加和保存该项目。希望您理解此说明。
- 对我来说,这仅在关联对象已更新的情况下有效。如果添加或删除了关联的对象,它对我不起作用(因为该对象不再存在于services关联中)。我究竟做错了什么?