【问题标题】:Ruby Object#id warnings and Active RecordRuby Object#id 警告和 Active Record
【发布时间】:2009-03-03 23:42:58
【问题描述】:

我们在运行规范时不断看到如下警告:

Object#id 将被弃用;使用 Object#object_id

有问题的代码正在访问 ActiveRecord 模型的 id(显然,这是表上的一个属性,而不是 Ruby VM 中的对象实例 ID)。

有谁知道如何关闭这些特定警告或以某种方式避免它们?

【问题讨论】:

  • 如果这是在测试中,您确定您访问的是真正的活动记录实体,而不是常规的 ruby​​ 对象吗?
  • 啊...这些很可能是模拟对象
  • 你应该回答这个问题,因为这完全解决了它。

标签: ruby-on-rails rspec warnings rails-activerecord


【解决方案1】:

尝试使用[:id] 而不是.id

【讨论】:

  • 因为有一个用户恶意并且对我的一切投反对票。
【解决方案2】:

当对象从ActiveRecord::Base 继承时,对id 的调用将转到AR::B 的id 方法,而不是Object 上已弃用的方法。

该警告通常意味着我的一个对象不是我想的那样。

【讨论】:

    【解决方案3】:

    我假设您正在模拟/存根(因为您提到了规格)。

    在我的例子中,当我存根一个 ActiveRecord 对象并访问它的 ID 属性时,我遇到了这些警告。

    如果您希望访问 ActiveRecord 对象的 ID,我建议您执行以下操作:

     mock("MyActiveRecordObject", :id => 1001)
    

    【讨论】:

      【解决方案4】:

      您的对象实际上不是 AR 对象,通常表示某些数据检索失败(Table.find_by_name('nonexistent name') 将返回nil)。如果您只想关闭可见的警告,您可以在配置中关闭whiny_nils,否则在尝试访问对象的属性并优雅地处理失败情况之前进行is_a? 测试。

      【讨论】:

        【解决方案5】:

        object#id 警告仅发生在 NilClass 等常规 ruby​​ 类上。 ActiveRecord::Base 覆盖 object#id

        【讨论】:

          猜你喜欢
          • 2017-07-07
          • 1970-01-01
          • 2011-10-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-05-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多