Question

Selon docs de ActiveRecord :: Base :

== (comparison_object) Renvoie true si comparison_object est exactement la même est de l'objet, ou le comparison_object même type et l'auto a une carte d'identité et il est égal à comparison_object.id.

Notez que les nouveaux enregistrements sont différents de tout autre document par définition, à moins que l'autre dossier est le récepteur lui-même. D'ailleurs, si vous allez chercher les enregistrements existants avec sélection et congé l'out ID, vous êtes vous-même, ce prédicat retournera false.

Notez également que la destruction d'un enregistrement conserve son identité dans le modèle par exemple, les modèles sont donc supprimés encore comparables.

Mais mes observations montrent qu'il ne compare que instaces, non Ids de sorte que suivantes sont remplies:

a = Factory.create(:user)
b = User.find_by_email(a.email) # b is logically same as a

a.id.should == b.id # All good
a.should == b # FAILS: Contradicts the docs
a.should_not == b # Contradicts the docs
a.should_not eql b # Contradicts the docs

La question est 2 sont considérés comme des cas de AR être différent alors que les documents disent explicitement que ceux-ci devraient être égaux?

Mise à jour: L'égalité ne fonctionne comme prévu . Exemple de code ci-dessus est hors de propos . Voir ma réponse ci-dessous.

Était-ce utile?

La solution

répondre à ma propre question (ce qui est hors de propos).

Tous les contrôles à l'égalité fonctionnent comme prévu (et décrit dans la documentation).
Je suppose que la raison pour laquelle il n'a pas fonctionné pour moi est que je lance autotest et quelque chose pourrait être mis en mémoire cache ou une autre raison mythique que je ne peux pas expliquer en ce moment.

En résumé, toutes les assertions suivantes passent en effet:

a = Factory.create(:user)
b = User.find_by_email(a.email) # b is logically same as a

a.id.should == b.id
a.should == b
a.should eql b
User.find_by_email(a.email).should == User.find_by_email(a.email)
a.should == User.find_by_email(a.email)
b.should == User.find_by_email(a.email)

Autres conseils

Regardez de plus près la définition:. Notez que les nouveaux enregistrements sont différents de tout autre document, par définition,

Dans ce cas, puisque AR normalement fait juste des contrôles d'égalité à la colonne d'identité, vous pouvez comparer les deux objets en comparant le résultat de ce #attributes retour pour chacun.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top