Ruby on rails RubyonRails重写equals

Ruby on rails RubyonRails重写equals,ruby-on-rails,ruby,Ruby On Rails,Ruby,我有一个model user.rb(它是一个ActiveRecord::Base,不确定它是否与讨论相关) 在某些视图中,我通过以下方式比较两个用户: <% if current_user == user %> 结果是不确定的(有时结果是真的,有时是假的),我不知道为什么 如果我换成 <% if current_user.id == user.id %> 它按预期工作。但是接下来我需要处理用户可以为null的情况 我的问题是,这里发生了什么 为什么user1=

我有一个model user.rb(它是一个ActiveRecord::Base,不确定它是否与讨论相关)

在某些视图中,我通过以下方式比较两个用户:

<% if current_user == user %>

结果是不确定的(有时结果是真的,有时是假的),我不知道为什么

如果我换成

<% if current_user.id == user.id %>

它按预期工作。但是接下来我需要处理用户可以为null的情况

我的问题是,这里发生了什么

为什么user1==user2在这里失败

我应该重写==,还是

我应该使用替代方法,如equal?、==或eql吗

user.rb是ActiveRecord::Base mean==默认情况下,不应该比较已经存在的id字段吗?

如果比较对象为,则返回true 完全相同的对象,或 比较对象的类型相同 self有一个ID,它等于 比较\u object.id

请注意,新记录是不同的 根据定义,从任何其他记录中, 除非另一个记录是 接收器本身。另外,如果你去拿 具有select和leave的现有记录 身份证出来了,你自己去,这个 谓词将返回false

还要注意销毁记录 在模型中保留其ID 实例,所以删除的模型仍然是 可比

它应该匹配
当前用户==用户


如何获取当前用户对象?

如果您想进一步了解ruby中的平等性,请看下面这篇非常好的博文:


希望这有助于您理解。

如果您查看
=

      # File lib/active_record/base.rb, line 2427
2427:       def ==(comparison_object)
2428:         comparison_object.equal?(self) ||
2429:           (comparison_object.instance_of?(self.class) &&
2430:             comparison_object.id == id &&
2431:             !comparison_object.new_record?)
2432:       end
可以看到,当对象ID匹配时,它应该返回true。如果你的代码对于同一个用户对象失败了,你肯定会有一些奇怪的事情发生


你能在上下文中发布代码片段吗?

当用户登录时,我将他的id保存在永久cookie中,作为“saved_id”。然后在当前\u用户中,返回user.find by\u id(保存的\u id)。由于current_user.id==user.id似乎正在工作,我相信我返回的是正确的“current user”你能试着打印
user.class
current_user.class
并发布输出吗?我在比较之前添加了这些行,它们都打印用户(id:integer,name:string,email:string…这是一个关于Ruby on Rails中的“==”的问题。Rails覆盖了Ruby的“==”,因此对于这个问题,这个答案是一个很难回答的问题。RoR==只使用Ruby的==来比较整数。感谢您提供的代码片段,看它肯定会让人放心。因为这只是一个简单的比较,很难理解。)除了我在原始问题中包含的内容之外,请给出简短的相关内容。让我进一步挖掘…@tstyle将此内容放入您的代码中,并让我们知道您得到了什么:if current_user!=user;puts user.inspect;puts current_user.inspect;endHey@DanSingerman抱歉,我完全忘记了返回此问题。最终通过重写使其正常工作ing==在用户对象中,上面有代码。谢谢。