object_id和id之间有什么区别?

时间:2014-05-13 15:56:31

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

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

但是,我不太清楚是什么让它们与众不同以及它们如何在上下文中使用。

请帮忙澄清!!

谢谢!

4 个答案:

答案 0 :(得分:3)

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

在Ruby中,object_id是一个表示相关对象标识的值。 总是填充了某些内容,因为Ruby中的所有内容都是对象。

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

如果两个变量引用具有相同object_id的内容,则它们引用完全相同的对象。

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

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

答案 1 :(得分: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)以使关系有效。

希望它有所帮助!

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

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

就在上下文中使用而言,通常你不会在代码中使用object_id:它是一个引擎盖下的东西。

编辑 - 另外,在旧版本的ruby / rails中看到了一个常见问题(其中object_id方法实际上被称为id,并被铁路的id方法覆盖)是因为nil的object_id是4。因此,您可以在一个您希望成为模型实例的变量上调用id,但实际上是nil,因此当您希望从数据库中获取记录的id时,会返回“4”。