如何确定ActiveRecord中的关联是否发生了变化?

时间:2018-04-02 02:38:13

标签: ruby-on-rails activerecord

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

协会有同等效力吗?我特意寻找has_many关联,但所有关联类型都很有用。

Rails 5.2,Ruby 2.5.1

2 个答案:

答案 0 :(得分:0)

根据文档显示,在关联上没有#association_changed?等效项。

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

答案 1 :(得分:0)

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

在我的项目中,我已经在使用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

再一次,这不是一个答案,但是就我而言,它确实起到了作用