为什么“Object#id将被弃用;使用Object#object_id”访问AR记录ID?

时间:2011-03-15 17:56:24

标签: ruby-on-rails activerecord

  

可能重复:
  Rails primary key and object id

我感到困惑的是为什么我不能引用对象的属性;希望有人能帮忙......

我需要构建一个哈希,它将Marker.marker_name与数据库中的id相关联,这些ID已经存储(记录ID将作为另一个表中的外键)。

所以,首先我通过这个命名的范围检索标记记录:

class Marker < ActiveRecord::Base    
named_scope :by_name, lambda { |marker_name| 
    {:conditions => ["marker_name = ?", marker_name]}}

从我的上传模型中调用,就像这样(marker_name的值为“Amelogenin”):

this_marker = Marker.by_name(marker_name)

我知道这很有效,因为当我使用调试器时,我可以看到this_marker中的内容,如下所示:

  

(rdb:2)y this_marker

     
      
  • !ruby / object:标记属性:   created_at:2011-03-14 22:21:27.244885   updated_at:2011-03-14 22:21:27.244885   id:“11”   marker_name:Amelogenin attributes_cache:{}
  •   

然而,我无法在哈希中分配记录ID,如下所示:

$markers[marker_name] = this_marker.id

我似乎无法以这种方式直接引用id;因为,即使在调试器中,我也会收到此错误:

(rdb:2) p this_marker.id
(__DELEGATION__):2: warning: Object#id will be deprecated; use Object#object_id

我需要使用某种不同的Ruby语法或者什么?如何将marker_name与其记录ID相关联?

提前致谢....

3 个答案:

答案 0 :(得分:0)

是一个非常令人困惑的错误消息,(我敢打赌这也是一个相当普遍的问题)。

Marker.by_name(marker_name)不返回活动记录对象,但是没有活动记录ID的范围只有Object#id方法,该方法已被弃用(并且已经在Ruby 1.9.2中使用)

范围是懒惰的 - 在您尝试使用它们之前它们不会访问数据库(或打印它们,就像您的情况一样)。

尝试Marker.by_name(marker_name).first

答案 1 :(得分:0)

当在非ActiveRecord对象上调用id方法时会发生此类错误。因此,请确保this_marker是AR对象实例。

this_marker = Marker.by_name(marker_name)你确定这会返回一个Marker对象吗?没有致电allfirst

答案 2 :(得分:0)

Marker.by_name(marker_name)会返回array个制作者。你应该写:

this_marker = Marker.by_name(marker_name).first