【问题标题】:Compare two records and get the names of the changed columns in rails active record比较两条记录并获取rails活动记录中更改列的名称
【发布时间】:2017-10-07 10:43:16
【问题描述】:

我需要比较两条活动记录并获取更改列的名称

#<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 我还需要获取列名。 这可以通过比较每一列来完成,但我正在寻找任何其他选项。

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-4 activerecord ruby-on-rails-3.2


    【解决方案1】:

    你可以使用activerecord-diffgem

    链接: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']}
    

    【讨论】:

    • 看起来它缺少 Rails 4.25.05.1 的 gemfile——大约 3 年没有提交。 (虽然它应该很容易更新!)
    • 通过命令将对象更改为哈希:obj.attributes 然后安装 gem hashdiff (github.com/liufengyun/hashdiff) 并进行比较
    • 我可以确认 activerecord-diff 在 Rails 5.0.1 和 ruby​​ 2.3.1 上运行良好。只需在 application.rb 文件中使用 require 'active_record/diff'
    【解决方案2】:

    你可以用一个小方法为你做到这一点:

    def diff_active_record(record_a, record_b)
       (record_a.attributes.to_a - record_b.attributes.to_a).map(&:first)
    end
    

    此方法将使用两个 active_record 对象(在本例中为:record_arecord_b)进行比较并生成一个已更改的属性名称数组。

    你可以这样使用它:

    diff_active_record(Evaluation.find(1), Evaluation.find(2)) 
    

    以上将导致[:id, :comments, :created_at, :updated_at]

    【讨论】:

    • 有趣的是,Rails 版本中曾经有一个Hash#diff 方法3.0.0 - 4.0.2,但当时是removed without replacement。但是,只需查看源代码就可以很容易地重新实现该方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多