Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 比较两条记录并获取rails活动记录中更改的列的名称_Ruby On Rails_Ruby_Ruby On Rails 4_Activerecord_Ruby On Rails 3.2 - Fatal编程技术网

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
中曾经有一个方法,但它当时是。但是,只要查看源代码就可以很容易地重新实现该方法。看起来Rails
4.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))