Rails:类'id / object_id在同一请求期间发生更改

时间:2010-10-25 21:00:28

标签: ruby-on-rails class module model

当我尝试比较两个Rails模型时,我遇到了问题。它们评估为相同,但ActiveRecord实现的方式==导致它失败。更奇怪的是单元测试正在通过。

假设用户有很多帖子,帖子有很多评论。用户也有很多评论。

(这是比较两个对象,应该是相同的)

User.first.comments.first == Post.forst.comments.first

当我将object_ids写出到Rails.logger时,它们并不相同。在深入挖掘源代码之后,我发现这种情况使它失败了。

http://github.com/rails/rails/blob/30dcac292606da0e031d1e0dfbb6fc6109e5da60/activerecord/lib/active_record/base.rb#L1602

我期待:

User.first.comments.class.object_id == Post.first.comments.class.object_id

但事实并非如此。

该模型包含一个模块,该模块在self.included(base)

中执行以下操作
base.send :include, InstanceMethods
base.send :extend,  ClassMethods

当我从模型中取出包含时,一切正常。

是否有包含/扩展模式的内容导致模型重新加载或未在同一请求中正确缓存?

这里的任何想法都会很棒!!!

1 个答案:

答案 0 :(得分:0)

object_id是实例的ruby id,而不是数据库中行的id。 ActiveRecord覆盖==比较id而不是object_id。