Frage

Nach Dokumenten von ActivereCord :: Basis:

== (Vergleiche_Object) gibt true zurück, wenn Vergleich_Object das gleiche genaue Objekt ist, oder Vergleich_Object ist vom gleichen Typ und selbst hat eine ID und es ist gleich gegenüber vergleiche_object.id.

Beachten Sie, dass neue Datensätze per Definition von einem anderen Datensatz unterschiedlich sind, es sei denn, der andere Datensatz ist der Empfänger selbst. Wenn Sie vorhandene Datensätze mit ausgewählten ID abrufen und die ID auslassen, sind Sie alleine, dieses Prädikat gibt falsch zurück.

Beachten Sie auch, dass die Zerstörung eines Datensatzes seine ID in der Modellinstanz bewahrt, sodass gelöschte Modelle weiterhin vergleichbar sind.

Meine Beobachtungen zeigen jedoch, dass es nur Instaces vergleicht und nicht IDs, so dass die folgenden wahr sind:

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

Die Frage ist, dass 2 AR -Instanzen als unterschiedlich angesehen werden, während die Dokumente ausdrücklich sagen, dass diese gleich sein sollten?

AKTUALISIEREN: Die Gleichheit Funktioniert wie erwartet. Die obige Codeprobe ist irrelevant. Siehe meine Antwort unten.

War es hilfreich?

Lösung

Beantwortung meiner eigenen Frage (was irrelevant ist).

Alle Gleichstellungsüberprüfungen funktionieren wie erwartet (und in den Dokumenten beschrieben).
Ich nehme an, der Grund, warum es bei mir nicht funktioniert hat, ist, dass ich renne autotest Und etwas könnte zwischengespeichert werden oder ein anderer mythischer Grund, den ich momentan nicht erklären kann.

Zusammenfassend lässt sich sagen, dass alle folgenden Behauptungen tatsächlich verabschiedet werden:

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)

Andere Tipps

Schauen Sie sich die Definition genauer an: Beachten Sie, dass neue Datensätze per Definition von jedem anderen Datensatz unterschiedlich sind.

In diesem Fall können Sie die beiden Objekte, da sie normalerweise nur die Gleichstellung überprüft, die beiden Objekte vergleichen, indem Sie das Ergebnis des jeweils #Attributes vergleichen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top