ActiveRecord :: Baseのドキュメントによると:
==(comparison_object)comparation_objectがまったく同じオブジェクトである場合、またはcomparation_objectが同じタイプであり、selfにIDがあり、comparation_object.idと等しい場合にtrueを返します。
他のレコードが受信者自体でない限り、新しいレコードは定義上他のレコードとは異なることに注意してください。さらに、selectを使用して既存のレコードをフェッチし、IDを省略した場合、あなたは自分自身であり、この述語はfalseを返します。
レコードを破棄すると、モデルインスタンスにそのIDが保持されるため、削除されたモデルは引き続き比較可能であることに注意してください。
しかし、私の観察によれば、IDではなく、インスタンスのみを比較するため、次のことが当てはまります。
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
問題は、2つのARインスタンスは異なると見なされますが、ドキュメントではそれらは等しくなければならないと明示的に述べていますか?
更新:平等は期待どおりに機能します。上記のコードサンプルは関係ありません。以下の私の答えを参照してください。