ActiveRecord:调用两次相同id的find,获取相同的实例?

时间:2013-11-16 04:44:01

标签: ruby-on-rails ruby activerecord

我试图弄清楚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是否会覆盖此方法?我的两个引用如何指向同一个实例并具有不同的值?

1 个答案:

答案 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的对象?是==。

的同义词