2008年1月16日星期三

How to compare ActiveRecord objects

在ruby里,有三种方法可以比较对象
  • == 比较是否是同一个对象,可以被覆写
  • equal? 比较是否是同一个对象,不能被覆写
  • eql? 比较对象是否有相同的值

在写测试的时候发现,如果两个ActiveRecord对象有相同的类型,又有相同的id,则用==来做比较的话,得出的结果是true,即使它们的值不相同。可见ActiveRecord覆写了==方法。
例:
a = Account.create(:name => "aaa")
b = Account.create(:name => "bbb")
而因为不知名的原因,在测试的时候a与b有相同的id,即
a.id #=> 0
b.id #=> 0
于是
a == b       #=> true    #因为a与b类型相同,id相等,ActiveRecord就认为它们是同一个对象
a.equal?(b) #=> false #因为不是同一个对象
a.eql?(b) #=> false #因为值不相等

没有评论: