3

有没有办法比较模型的两个实例

Model.compare_by_name("model1", "model2") 将列出不同的列字段

4

3 回答 3

4

ActiveRecord::Diff如果您想要所有不同字段及其值的映射,则可以使用。

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']}
于 2013-06-14T19:17:02.720 回答
2

对此没有标准比较器。标准 ActiveModel 比较器:

Returns true if comparison_object is the same exact object, or comparison_object is of the same type and self has an ID and it is equal to comparison_object.id.

您可以使用 activesupport 的 Hash#diff 编写自己的代码。像下面这样的东西应该可以帮助你开始:

def Model.compare_by_name(model1, model2)
  find_by_name(model1).attributes.diff(find_by_name(model2).attributes)
end
于 2013-06-14T19:18:09.120 回答
2

在不使用库或定义自定义方法的情况下,您可以轻松获得两个模型之间的差异。

例如,

a = Foo.first
b = Foo.second

a.attributes = b.attributes

a.changes #=> {"id" => [1,2] }
于 2020-04-24T07:42:47.257 回答