2009-12-17 3 views
1

Пусть этот кодЯвляются ли несколько экземпляров ActiveRecord синхронизированными автоматически?

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

ли instance1.equals(instance2) правда? (Т.е. они одни и те же объекты?)

И после этого:

instance1.my_column = "new value" 

ли instance2.my_column также содержать "новое значение"?

ответ

3

Нет, это не так. Вы можете сохранить instance2 в синхронизации с reload.

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 изменения в базу данных.

+0

oh gosh am I slowpoke :) –

2
  1. instance1.equals (instance2) не соответствует действительности. В Rails они не одни и те же объекты. AFAIK, в Merb они
  2. instance2.my_column не будет содержать новое значение, если вы не сохраните Instance1 и сделать instance2.reload
3

weppos совершенно правильно для второй части вашего вопроса. Для первой части есть некоторая тонкая разница в равенстве, зависящем от того, как вы тестируете.

instance1.eql?(instance2) 
    => true 

.eql? проверяет, имеют ли объекты один и тот же тип и значение, тогда как

instance1.equal?(instance2) 
    => false 

.equal? проверяет объекты имеют один и тот же object_id и возвращает ложь, потому что

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

Существует хорошая статья на эту тему here

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

Смежные вопросы