object_id的另一个名称是什么?

时间:2011-03-10 04:01:20

标签: ruby-on-rails ruby

我刚刚意识到我的一个模型有一个object_id列,这会引起问题。

有关名称object_id的可能替代方案的任何建议吗?

3 个答案:

答案 0 :(得分:3)

该列应该映射到什么?它是 对象 表的外键吗?

弄清楚你真正要表达的是什么。这可能不仅仅是整个世界的任何通用事物。 (如果是,可能 是一个更好的名字。)

如果您在限制条件下工作并且绝对必须拥有object_id列,那么您仍然可以使用attributes[:object_id]直接引用它并绕过Rails的魔术方法。

作为最后的手段,您可以使用自己的#object_id方法覆盖该方法,该方法只是从数据库中返回该属性(这是Rails使用#id方法执行的操作)。我想不出任何能够完全摆脱头脑的东西,但这可能不是一个好主意。对象ID用于许多其他事情,因此如果进行对象比较,将对象用作哈希键等,可能会出现奇怪的行为。

答案 1 :(得分:0)

您不需要在模型中使用object_id。并且数据库中不应该有名为object_id的列。

object_id只是一个默认方法,所有(Ruby 1.9中的BasicObject除外)对象都有(参见docs)。

  

返回obj的整数标识符。   将返回相同的号码   所有对给定对象的id调用,   并且没有两个活动对象将共享   一个身份证。   替换已弃用的Object#id

2.object_id # 5 or anything, but the same
2.id # NoMethodError: undefined method `id' for 2:Fixnum
2.object_id # 5
"anything has object_id".object_id # 22522080
"anything has object_id".object_id # 22447200 - string has different object_id because it's a new instance everytime

因此,只需使用id来访问ActiveRecord类的数据库标识符。这是Ruby On Rails为模型对象创建的。


OR 如果您确实需要在数据库中使用名为object_id的列,那么您可以在ActiveRecord模型上创建一个方法,如下所示:

def general_id
  read_attribute(:object_id)
end

答案 2 :(得分:0)

我很惊讶Rails没有创建__object_id__作为对object_id原始形式的引用,就像send有一个名为__send__的Ruby变体一样

编辑:Ruby方法__id__似乎是__send__的{​​{1}}等价物。使用object_id作为外键的方法可能是安全的,也可能不安全。我目前的工作中并没有使用Rails。