2009-12-17 3 views

Répondre

3

Non, ce n'est pas le cas. Vous pouvez garder instance2 en synchronisation avec 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 

Gardez à l'esprit que vous devez enregistrer instance1 modifications apportées à la base de données.

+0

oh gosh suis-je un slowpoke :) –

2
  1. instance1.equals (instance2) n'est pas true. Dans Rails, ils ne sont pas les mêmes objets. Autant que je sache, dans Merb ils
  2. instance2.my_column ne contiennent pas une nouvelle valeur, à moins que vous enregistrez instance1 et faire instance2.reload
3

weppos est tout à fait correct pour la deuxième partie de votre question. Pour la première partie, il y a une différence subtile à l'égalité qui dépend de la façon dont vous testez.

instance1.eql?(instance2) 
    => true 

.eql? vérifie si les objets ont le même type et la même valeur tandis que

instance1.equal?(instance2) 
    => false 

.qualité? vérifie si les objets ont la même object_id et retourne faux parce que

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

Il y a un bon article sur ce sujet here

0

Weet @ Steve

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..) 

donc ... ce qui indique rails vérifiez que le modèle equality dépend de son attribut id.
BTW: Je tester est en ruby193/rails4rc

Questions connexes