【问题标题】:How to determine if association changed in ActiveRecord?如何确定 ActiveRecord 中的关联是否发生了变化?
【发布时间】:2018-09-11 06:39:50
【问题描述】:

ActiveRecord 提供更改跟踪,其中调用 #name_changed? 返回 true/false,具体取决于 name 属性在模型加载到现在之间是否发生变化。

是否有关联的等价物?我正在专门寻找 has_many 关联,但所有关联类型都会很有用。

Rails 5.2、Ruby 2.5.1

【问题讨论】:

  • 我想这取决于 Rails 在查询对象时是否缓存关联
  • 我可能没有正确理解这个问题,但不应该在关联上调用#name_changed? 吗?
  • @user2490003,我不想知道其中一条记录中的属性名称是否更改,我想知道是否从关联中添加或删除了任何记录。

标签: ruby-on-rails activerecord


【解决方案1】:

好的,不是答案,但这是我想出的解决方法。

在我的项目中,我已经在使用 gem audited 来跟踪我也想接收更改的模型的更改。在我的情况下,模型是Location,我想检查位置是否发生变化的模型是Employee

然后在after_save 中检查是否对该位置进行了审核,以及是否在几秒钟内创建。如果是这样,我可以检查更改。

简化示例:

# app/models/location.rb
class Location < ApplicationRecord
  audited
end

# app/models/employee.rb
class Employee < ApplicationRecord
  after_save :inform_about_changes!
  belongs_to :location

  def inform_about_changes!
    last_location_change = location.audits.last
    if last_location_change.created_at.between?(2.seconds.ago, Time.now)
      if last_location_change.audited_changes.include? 'city'
        city_was = last_location_change.audited_changes[0]
      end
    end
  end
end

再一次,这不是一个答案,但它在我的情况下完成了工作

【讨论】:

    【解决方案2】:

    就文档显示的关联而言,没有 #association_changed? 等效项。

    https://api.rubyonrails.org/classes/ActiveRecord/Associations/CollectionProxy.html

    【讨论】:

      【解决方案3】:

      has_many - 不 但是如果我们谈论belongs_to :user 你可以使用这样的东西object.saved_change_to_user_id?

      【讨论】:

      • object.saved_change_to_user_id? == object.user_id_changed?,所以它只在对象更改用户的情况下返回true,但是,我认为这个关于跟踪用户是否属于对象的问题被更改(例如更改用户名)。
      猜你喜欢
      • 2011-01-15
      • 1970-01-01
      • 2021-05-01
      • 2014-07-06
      • 1970-01-01
      • 2020-12-03
      • 1970-01-01
      • 2012-02-12
      • 1970-01-01
      相关资源
      最近更新 更多