多个ActiveRecord实例是否自动保持同步?

时间:2009-12-17 09:51:03

标签: ruby-on-rails

假设此代码

instance1 = MyModel.find(1)
instance2 = MyModel.find(1)

instance1.equals(instance2)是真的吗? (即它们是相同的物体吗?)

之后:

instance1.my_column = "new value"

instance2.my_column是否还包含“新值”?

4 个答案:

答案 0 :(得分:3)

不,它没有。您可以instance2reload保持同步。

instance1 = MyModel.find(1)
instance2 = MyModel.find(1)

instance1.my_column = "new value"
instance2.my_column 
# => old value

instance1.save!
instance2.my_column 
# => old value

instance2.reload
instance2.my_column 
# => new value

请记住,您必须将instance1更改保存到数据库中。

答案 1 :(得分:3)

对于问题的第二部分,weppos是完全正确的。对于第一部分,然后根据您的测试方式,在平等方面存在一些细微差别。

instance1.eql?(instance2)
  => true

.eql?检查对象是否具有相同的类型和值,而

instance1.equal?(instance2)
  => false

.equal?检查对象是否具有相同的object_id并返回false,因为

instance1.object_id
  => 18277960
instance2.object_id
  => 18271750

有一篇关于这个主题的好文章here

答案 2 :(得分:2)

  1. instance1.equals(instance2)不正确。在Rails中,它们不是同一个对象。 AFAIK,在Merb他们会
  2. instance2.my_column不包含新值,除非您保存instance1并执行instance2.reload

答案 3 :(得分:0)

@Steve Weet

instance1 = User.find(1)
instance2 = User.find(1)
instance1 == instance2   # -> true
instance1.name = "zhangsan"
instance1 == instance2   # true  (not false)
instance1.id = 0
instance1 == instance2   # false (this time)
instance1.id = 1
instance1 == instance2   # true  (oh..)

所以......这表明rails检查模型equality取决于其id属性。
BTW:我测试的是ruby193 / rails4rc