有人可以解释一下 AR 对象的这种行为吗:
u = User.first
uu = u.dup
uu == u #=> true
u == uu #=> false
为什么后者不正确?
有人可以解释一下 AR 对象的这种行为吗:
u = User.first
uu = u.dup
uu == u #=> true
u == uu #=> false
为什么后者不正确?
这是因为如果第二个对象是新记录则ActiveRecord::Base#==
返回。false
既然uu.new_record?
是true
,当做u == uu
它返回false
;但是u.new_record?
是false
,因此uu == u
不会通过该检查。
这种行为自 Rails 3.0 和两者以来都发生了变化u == uu
,uu == u
并将false
在 Rails 3.2(可能还有 3.1)中返回。
当我在Ruby 1.9.3p194
and上运行它时Rails 3.2.3
,我都得到了错误,所以我只能假设这是一个已修复的错误。
至于为什么会发生这种情况,我的理论是,复制的记录会记住它的来源,因此与原始记录相比,它知道返回真实。原版没有这样的信息,因此不知道如何识别它的克隆。