Ruby on rails 比较两条记录并获取rails活动记录中更改的列的名称
我需要比较两个活动记录并获得更改列的名称Ruby on rails 比较两条记录并获取rails活动记录中更改的列的名称,ruby-on-rails,ruby,ruby-on-rails-4,activerecord,ruby-on-rails-3.2,Ruby On Rails,Ruby,Ruby On Rails 4,Activerecord,Ruby On Rails 3.2,我需要比较两个活动记录并获得更改列的名称 #<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
#<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">
#
#
我需要比较这两个记录并获得更改列的名称。在这种情况下,:注释,:created_at,:updated_at
我尝试过使用类似于eql?
,record1.attributes.except('id')==record2.attributes.except('id')
这些只返回true或false,我还需要获取列名。
这可以通过比较每一列来完成,但我正在寻找任何其他选项。您可以使用
activerecord diff
gem
链接:
需要“活动记录/diff”
类用户'alice',:email\u address=>'alice@example.org')
bob=User.create(:name=>'bob',:email\u address=>'bob@example.org')
alice.diff?(bob)#=>对
alice.diff(bob)#=>{:name=>['alice','bob'],:email\u address=>['alice@example.org', 'bob@example.org']}
alice.diff({:name=>'eve'}){:name=>['alice','eve']}
您可以使用一种小方法来完成此操作:
def diff_active_record(record_a, record_b)
(record_a.attributes.to_a - record_b.attributes.to_a).map(&:first)
end
此方法将使用两个活动的记录对象(在本例中:record\u a
,record\u b
)来比较并生成已更改的属性名称数组
您可以这样使用它:
diff_active_record(Evaluation.find(1), Evaluation.find(2))
上面的内容将导致
[:id,:comments,:created_at,:updated_at]
有趣的是,Rails版本3.0.0
-4.0.2
中曾经有一个方法,但它当时是。但是,只要查看源代码就可以很容易地重新实现该方法。看起来Rails4.2
、5.0
和5.1
,在大约3年的时间里都没有提交。(虽然它应该很容易更新!)将object更改为hash by command:obj.attributes,然后安装gem hashdiff()并进行比较。我可以确认activerecord diff在Rails 5.0.1和ruby 2.3.1上工作得很好。只需在application.rb文件中使用require'active_record/diff'
diff_active_record(Evaluation.find(1), Evaluation.find(2))