有人可以解释一下 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.3p194and上运行它时Rails 3.2.3,我都得到了错误,所以我只能假设这是一个已修复的错误。
至于为什么会发生这种情况,我的理论是,复制的记录会记住它的来源,因此与原始记录相比,它知道返回真实。原版没有这样的信息,因此不知道如何识别它的克隆。