我试图弄清楚ActiveRecord是否在事务中(甚至在请求中)缓存模型实例,所以我运行了以下代码并且对我看到的内容感到惊讶:
User.transaction do
u1 = User.find(1)
u2 = User.find(1)
puts u1.eql?(u2) # outputs true, this means they are the same instance
puts u1.email # outputs 'user@gmail.com'
u1.email = 'foo' # change the email, should change on u1 and u2
puts u1.email # outputs 'foo'
puts u2.email # outputs 'user@gmail.com' # how can the values be different if u1 and u2 are the same instance?
end
不是.eql?在Ruby中应该评估实例的相等性?是什么赋予了? ActiveRecord是否会覆盖此方法?我的两个引用如何指向同一个实例并具有不同的值?
答案 0 :(得分:3)
听起来你在想.equal?
来自http://ruby-doc.org/core-2.0.0/Object.html:
与==不同,相等?方法永远不应该被子类覆盖 因为它用于确定对象身份(即a.equal?(b)if 并且只有当a是与b)相同的对象时:
和
eql?如果obj和其他引用相同,则返回true 散列键。 Hash使用它来测试成员是否相等。对于 类Object,eql的对象?是==。
的同义词