【问题标题】:Rails 3 has_many changed?Rails 3 has_many 改变了吗?
【发布时间】:2012-02-21 18:03:48
【问题描述】:

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

has_many :listing_services
has_many :services, through: :listing_services

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

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

【问题讨论】:

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


    【解决方案1】:

    我没有使用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 时添加和保存该项目。希望您能理解这一说明。

    【讨论】:

    • 对我来说,这只有在关联对象更新时才有效。如果添加或删除了关联的对象,它对我不起作用(此后它不再存在于services 关联中)。我做错了什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多