Rails 控制台比较模型实例

Posted

技术标签:

【中文标题】Rails 控制台比较模型实例【英文标题】:Rails console compare model instances 【发布时间】:2013-06-11 12:24:08 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

例如,

a = Foo.first
b = Foo.second

a.attributes = b.attributes

a.changes #=> "id" => [1,2] 

【讨论】:

【参考方案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

【讨论】:

【参考方案3】:

如果您想要所有不同字段及其值的映射,您可以使用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']

【讨论】:

以上是关于Rails 控制台比较模型实例的主要内容,如果未能解决你的问题,请参考以下文章

Rails:重命名控制器和相应的模型

11--Rails数据交互3

如何在控制台中调用rails 3模型方法

Rails创建一个简单的函数,在系统范围的控制台中运行

Rails - 模型不通过方法保存属性,但如果手动分配(在控制台中)

无法在rails控制台中访问Mysql模型。