我刚刚意识到我的一个模型有一个object_id
列,这会引起问题。
有关名称object_id
的可能替代方案的任何建议吗?
答案 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。