ruby-on-rails – Rails 3 has_many已更改?

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – Rails 3 has_many已更改?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我需要跟踪这样一个关联设置的更改(添加删除):
has_many :listing_services
has_many :services,through: :listing_services

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

问题是,对于has_many属性,最好的方法是什么?

解决方法

我没有使用更改方法.但我确信你总是可以使用魔术方法< attribute_name> _changed?和< attribute_name> _was:
services.any? {|s| s.attribute_name_changed?}
services.map(&:attribute_name_was)

有关更多信息,请参阅Ryan Bates的轨道车辆:#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回调将仅在构建时调用一次关联对象.这意味着如果父级有验证,则构建的项不会保存在数据库中,并且不能依赖于after_add回调.换句话说,它并不表示添加关联的记录保存在数据库中.所以你有保证项目被添加和只保存在call items.create.我希望你明白这个澄清.

猜你在找的Ruby相关文章