gpt4 book ai didi

ruby-on-rails - Rails 3 has_many 改变了吗?

转载 作者:数据小太阳 更新时间:2023-10-29 06:46:09 25 4
gpt4 key购买 nike

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

has_many :listing_services
has_many :services, through: :listing_services

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

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

最佳答案

我没有使用 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 .我希望您理解这一说明。

关于ruby-on-rails - Rails 3 has_many 改变了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9382708/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com