【问题标题】:ruby on rails overriding equalsruby on rails 覆盖等于
【发布时间】:2011-01-17 09:58:19
【问题描述】:

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

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

<% if current_user == user %>

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

如果我切换到

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

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

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

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

我应该覆盖 == 还是

我是否应该使用其他方法,例如 equal?、=== 或 eql?

user.rb 是一个 ActiveRecord::Base 意味着 == 默认情况下不应该已经比较了 id 字段吗?

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    如果你看==的源码

          # 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。如果您的代码 &lt;% if current_user == user %&gt; 对同一个用户对象失败,那么您肯定遇到了一些奇怪的事情。

    您能在上下文中发布该代码 sn-p 吗?

    【讨论】:

    • 谢谢你的sn-p,看了绝对让人放心。由于这只是一个直接的比较,除了我在原始问题中包含的内容之外,很难给出简短的相关性。让我挖掘更多...
    • @tstyle 将其放入您的代码中并告诉我们您得到了什么: if current_user != user;将 user.inspect;放 current_user.inspect;结束
    • 嘿@DanSingerman 抱歉,我完全忘了回到这个问题。最终通过使用上面的代码覆盖用户对象中的 == 使其工作。谢谢。
    【解决方案2】:

    来自http://api.rubyonrails.org/classes/ActiveRecord/Base.html#method-i-%3D%3D

    如果 compare_object 是,则返回 true 相同的确切对象,或 比较对象属于同一类型 并且 self 有一个 ID 并且它等于 比较对象.id。

    请注意,新记录是不同的 根据定义,来自任何其他记录, 除非另一条记录是 接收机本身。此外,如果你取 带有选择和离开的现有记录 ID出来了,你自己一个人,这个 谓词将返回 false。

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

    它应该匹配current_user == user

    你是如何获取 current_user 对象的?

    【讨论】:

    • 当用户登录时,我将他的 id 作为“saved_id”保存在一个永久 cookie 中。然后在 current_user 中,我返回 User.find_by_id(saved_id)。由于 current_user.id == user.id 似乎正在工作,我相信我正在返回正确的“当前用户”
    • 您可以尝试打印user.classcurrent_user.class 并发布输出吗?
    • 我在比较之前添加了这些行, ,它们都打印 User(id: integer, name :字符串,电子邮件:字符串...
    【解决方案3】:

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

    http://www.skorks.com/2009/09/ruby-equality-and-object-comparison/

    希望这能帮助你理解。

    【讨论】:

    • 这是一个关于 Ruby on Rails 中 '==' 的问题。 Rails 覆盖了 Ruby 的 '==',所以对于这个问题,这个答案是一个红鲱鱼。 RoR == 仅使用 Ruby 的 == 来比较整数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-03
    • 2012-07-08
    • 1970-01-01
    • 2016-07-05
    • 2016-07-23
    • 2019-01-19
    相关资源
    最近更新 更多