我正在寻找一种比较2个rails对象并找到差异的方法。
实施例
class User
has_many :books
belongs_to :college
end
class Book
belongs_to :user
end
class College
has_many :users
end
如何深入比较两个用户对象,并找出差异以及相关对象的变化
现在假设我有2个用户对象实例
user1 = User.first ==> {id:1,姓名:'第一个',年龄:22}
user1有2本名为book1和book2的书籍,属于大学C1 {name:'pqr'}
现在我有另一个实例user2,它是user1的修改版本,
现在user2 => {id:2,name:'first last1',age:23}和user2对象只有一本book1(book2从关联中删除)。大学C1名称更改为{name:'pqw'}
答案 0 :(得分:1)
ActiveRecord#==
只检查self
,而另一个对象是同一个类的实例并且具有相同的id
。如果您想比较它们的属性和关联,您需要自己编写自定义方法。
这样的事可能有用:
# in models/application_record.rb
def attributes_eq?(other)
self == other && attributes == other.attributes
end
# in models/user.rb
def attributes_eq?(other)
super &&
college.attributes_eq?(other.college) &&
books_ids == other.book_ids &&
books.zip(other.books).all? { |a, b| a.attributes_eq?(b) }
end
答案 1 :(得分:1)
使用Marshal.dump序列化两个对象
def deep_equals(a, b)
Marshal.dump(a) == Marshal.dump(b)
end```
答案 2 :(得分:0)
在User中定义您自己的==方法并定义您的自定义逻辑。
def ==(obj)
#check all attributes or whatever you want to compare, if at somepoint you find a false checking attrs, return false, otherwise return true.
end