如何深入比较2个红宝石对象

时间:2017-12-13 05:22:51

标签: ruby-on-rails ruby

我正在寻找一种比较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'}

3 个答案:

答案 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