【发布时间】:2014-05-13 15:56:31
【问题描述】:
对于任何模型实例,都有一个#object_id 和#id - 我知道它们不一样。
但是,我不太确定它们的不同之处以及它们各自在上下文中的使用方式。
请帮忙解决这个问题!
谢谢!
【问题讨论】:
标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4
对于任何模型实例,都有一个#object_id 和#id - 我知道它们不一样。
但是,我不太确定它们的不同之处以及它们各自在上下文中的使用方式。
请帮忙解决这个问题!
谢谢!
【问题讨论】:
标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4
在 Rails 中,ActiveRecord 模型实例有一个id 属性,该属性映射到存储在数据库的id 列中的值。如果记录尚未保存,这可能是nil。
在 Ruby 中,object_id 是一个代表相关对象身份的值。它总是填充了一些东西,因为 Ruby 中的一切都是一个对象。
这两个没有关系。一个模型可能有多个独立实例,每个实例都有自己的object_id 值,但id 相同。
如果两个变量引用相同的object_id,那么它们引用的对象完全相同。
在代码中很少看到object_id,它是一个几乎不需要的Ruby 内部代码。主要是确定您是在谈论相同的对象,还是只是等效的对象。
另一方面,您会看到id 和经常使用的类似值,因为这是将您的关系数据库粘合在一起的粘合剂。
【讨论】:
id 和 object_id 可以简称为 primary 和 foreign keys 吗?
object_id 与您的数据库完全无关。它特定于单个 Ruby 进程,不能指望它是任何东西,也可能是一个唯一的随机数。另一方面,id 由您的数据库定义,并且预计会随着时间的推移保持一致,可能永远不会改变。一般而言,id 通常是您的 主键,但是像 user_id 这样引用 users.id 的东西可以被视为 外键,因为它在另一个表中.
简而言之,:id 是表的默认primary_key。而object_id 可能是foriegn_key,除非您设置custom foreign_key。
例如,取这两个表users和posts。关系将是
user => has_many posts 和
post => belongs to user
所以在posts 表中,我们应该创建一个foreign_key(在本例中为user_id)以使关系有效。
希望对你有帮助!
【讨论】:
id 特定于 ActiveModel 记录,它与数据库中的 id 列相关。 object_id 是在 Object 上定义的,并且对于内存中创建的每个对象都是唯一的。
【讨论】:
Ruby 中的一切(我的意思是一切)都是对象。这些对象中的每一个都有一个 object_id,基本上是用于在内存中跟踪它们的值。
在 Rails 中,模型实例会自动设置方法以从数据库中的相应列返回它们的值。 .id 就是其中之一。
就在上下文中使用而言,通常您永远不会在代码中使用 object_id:它是一个底层的东西。
编辑 - 顺便说一句,在旧版本的 ruby/rails 中看到的一个常见问题(其中 object_id 方法实际上被称为 id,并被 rail 的 id 方法覆盖)是由以下事实引起的nil 的 object_id 是 4。所以你会在一个你期望是模型实例的变量上调用 id ,但实际上是 nil ,因此当你期望从数据库中获取记录的 id 时得到“4”。
【讨论】:
end 关键字不是对象。然而,公平地说,一切计算为一个对象。
end 本身不是一个对象,但它最终产生的任何结果都保证是一个对象。