Pregunta

Según los documentos de Activerecord :: Base:

== (comparación_object) Devuelve True si Comparison_Object es el mismo objeto exacto, o comparación_object es del mismo tipo y Self tiene una ID y es igual a comparación_object.id.

Tenga en cuenta que los nuevos registros son diferentes de cualquier otro registro por definición, a menos que el otro registro sea el receptor mismo. Además, si obtiene registros existentes con seleccionar y deja la identificación fuera, está solo, este predicado devolverá falso.

Tenga en cuenta también que destruir un registro conserva su ID en la instancia del modelo, por lo que los modelos eliminados aún son comparables.

Pero mis observaciones muestran que solo compara instancias, no IDS para que los siguientes sean verdaderos:

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 pregunta es que 2 instancias AR se consideran diferentes, mientras que los documentos dicen explícitamente que deberían ser iguales.

ACTUALIZAR: La igualdad Funciona como se esperaba. La muestra de código anterior es irrelevante. Vea mi respuesta a continuación.

¿Fue útil?

Solución

Respondiendo a mi propia pregunta (que es irrelevante).

Todos los controles de igualdad funcionan como se esperaba (y descritos en los documentos).
Supongo que la razón por la que no funcionó para mí es que corro autotest Y algo podría almacenarse en caché o alguna otra razón mítica que no puedo explicar en este momento.

Para resumir, todas las siguientes afirmaciones están pasando:

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)

Otros consejos

Mire más de cerca la definición: Tenga en cuenta que los nuevos registros son diferentes de cualquier otro registro por definición..

En este caso, dado que AR normalmente solo realiza verificaciones de igualdad con la columna de identidad, puede comparar los dos objetos comparando el resultado de lo que #ATtributes Return para cada uno.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top