Ruby on rails RubyonRails重写equals
我有一个model user.rb(它是一个ActiveRecord::Base,不确定它是否与讨论相关) 在某些视图中,我通过以下方式比较两个用户: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=
<% 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==在用户对象中,上面有代码。谢谢。