我需要比较两个活动记录并获取更改列的名称
#<Evaluation id: 1, name: "Foo", status: "yes", comments: "can be better", created_at: "2017-05-09 12:00:00", updated_at: "2017-05-09 12:00:00">
#<Evaluation id: 2, name: "Foo", status: "yes", comments: "keep up the good work", created_at: "2017-05-09 12:05:00", updated_at: "2017-05-09 12:05:00">
我需要比较这两个记录并获取更改列的名称。在这种情况下:comments, :created_at, :updated_at
我尝试过使用eql?
,record1.attributes.except('id') == record2.attributes.except('id')
这些只返回true或false我还需要获取列名。 这可以通过比较每一列来完成,但我正在寻找任何其他选项。
答案 0 :(得分:3)
您可以使用一种小方法为您执行此操作:
def diff_active_record(record_a, record_b)
(record_a.attributes.to_a - record_b.attributes.to_a).map(&:first)
end
此方法将使用两个active_record对象(在本例中为record_a
,record_b
)来比较并生成已更改的属性名称数组。
你可以这样使用它:
diff_active_record(Evaluation.find(1), Evaluation.find(2))
以上结果会导致[:id, :comments, :created_at, :updated_at]
答案 1 :(得分:1)
您可以使用activerecord-diff
gem
link:https://github.com/tim/activerecord-diff
require 'active_record/diff'
class User < ActiveRecord::Base
include ActiveRecord::Diff
end
alice = User.create(:name => 'alice', :email_address => 'alice@example.org')
bob = User.create(:name => 'bob', :email_address => 'bob@example.org')
alice.diff?(bob) # => true
alice.diff(bob) # => {:name => ['alice', 'bob'], :email_address => ['alice@example.org', 'bob@example.org']}
alice.diff({:name => 'eve'}) # => {:name => ['alice', 'eve']}