【问题标题】:what is the difference between an object_id, and id?object_id 和 id 有什么区别?
【发布时间】:2014-05-13 15:56:31
【问题描述】:

对于任何模型实例,都有一个#object_id 和#id - 我知道它们不一样。

但是,我不太确定它们的不同之处以及它们各自在上下文中的使用方式。

请帮忙解决这个问题!

谢谢!

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4


    【解决方案1】:

    在 Rails 中,ActiveRecord 模型实例有一个id 属性,该属性映射到存储在数据库的id 列中的值。如果记录尚未保存,这可能是nil

    在 Ruby 中,object_id 是一个代表相关对象身份的值。它总是填充了一些东西,因为 Ruby 中的一切都是一个对象。

    这两个没有关系。一个模型可能有多个独立实例,每个实例都有自己的object_id 值,但id 相同。

    如果两个变量引用相同的object_id,那么它们引用的对象完全相同。

    在代码中很少看到object_id,它是一个几乎不需要的Ruby 内部代码。主要是确定您是在谈论相同的对象,还是只是等效的对象。

    另一方面,您会看到id 和经常使用的类似值,因为这是将您的关系数据库粘合在一起的粘合剂。

    【讨论】:

    • idobject_id 可以简称为 primaryforeign keys 吗?
    • object_id 与您的数据库完全无关。它特定于单个 Ruby 进程,不能指望它是任何东西,也可能是一个唯一的随机数。另一方面,id 由您的数据库定义,并且预计会随着时间的推移保持一致,可能永远不会改变。一般而言,id 通常是您的 主键,但是像 user_id 这样引用 users.id 的东西可以被视为 外键,因为它在另一个表中.
    【解决方案2】:

    简而言之,:id 是表的默认primary_key。而object_id 可能是foriegn_key,除非您设置custom foreign_key

    例如,取这两个表usersposts。关系将是

    user => has_many posts

    post => belongs to user
    

    所以在posts 表中,我们应该创建一个foreign_key(在本例中为user_id)以使关系有效。

    希望对你有帮助!

    【讨论】:

    • 我觉得这个答案不好。 @tadman 是正确的。
    【解决方案3】:

    id 特定于 ActiveModel 记录,它与数据库中的 id 列相关。 object_id 是在 Object 上定义的,并且对于内存中创建的每个对象都是唯一的。

    【讨论】:

    • 对不起,我应该更清楚,对象是一个占位符。考虑以下问题,product_id 与 product.id 有何不同?谢谢!
    • 哈哈,这完全改变了你问题的性质!如果我是你,我会删除这个问题并从一个不那么误导的例子重新开始!
    • @user3399101 这完全是误导!你真的在寻找 id(primary_key) 和 object_id(foreign_key) 之间的区别吗?
    • 知道了!这就是答案。 product.id 将是主键,而 product_id 将是外键。另外,感谢 Max Williams 和其他人,您的回答仍然有用,所以我不会删除这个问题。
    【解决方案4】:

    Ruby 中的一切(我的意思是一切)都是对象。这些对象中的每一个都有一个 object_id,基本上是用于在内存中跟踪它们的值。

    在 Rails 中,模型实例会自动设置方法以从数据库中的相应列返回它们的值。 .id 就是其中之一。

    就在上下文中使用而言,通常您永远不会在代码中使用 object_id:它是一个底层的东西。

    编辑 - 顺便说一句,在旧版本的 ruby​​/rails 中看到的一个常见问题(其中 object_id 方法实际上被称为 id,并被 rail 的 id 方法覆盖)是由以下事实引起的nil 的 object_id 是 4。所以你会在一个你期望是模型实例的变量上调用 id ,但实际上是 nil ,因此当你期望从数据库中获取记录的 id 时得到“4”。

    【讨论】:

    • “Ruby 中的一切(我的意思是一切)都是一个对象。”不,不是一切。例如,end 关键字不是对象。然而,公平地说,一切计算为一个对象。
    • @JohnFeminella Everything evaluates to 一个对象可能是一种更好的放置方式。 end 本身不是一个对象,但它最终产生的任何结果都保证是一个对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-06
    • 2010-10-07
    • 2011-05-20
    • 2015-10-14
    • 1970-01-01
    • 2020-02-03
    相关资源
    最近更新 更多