Консоль Rails сравнивает экземпляры модели

Есть ли способ сравнить два экземпляра модели, например

Model.compare_by_name("model1", "model2"), в котором будут перечислены разные поля столбцов.


person Dhamodaran    schedule 14.06.2013    source источник


Ответы (3)


Вы можете использовать ActiveRecord::Diff, если хотите сопоставить все отличающиеся поля и их значения.

alice = User.create(:name => 'alice', :email_address => '[email protected]')
bob = User.create(:name => 'bob', :email_address => '[email protected]')    
alice.diff?(bob)  # => true
alice.diff(bob)  # => {:name => ['alice', 'bob'], :email_address => ['[email protected]', '[email protected]']}
alice.diff({:name => 'eve'})  # => {:name => ['alice', 'eve']}
person Chris Cashwell    schedule 14.06.2013

Для этого нет стандартного компаратора. Стандартный компаратор 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.

Вы можете написать свой собственный, используя Hash#diff от activesupport. Что-то вроде следующего, надеюсь, должно помочь вам начать:

def Model.compare_by_name(model1, model2)
  find_by_name(model1).attributes.diff(find_by_name(model2).attributes)
end
person Puhlze    schedule 14.06.2013

Без использования библиотеки или определения пользовательского метода вы можете легко получить разницу между двумя моделями.

Например,

a = Foo.first
b = Foo.second

a.attributes = b.attributes

a.changes #=> {"id" => [1,2] }
person Quv    schedule 24.04.2020