5

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インスタンスは異なると見なされますが、ドキュメントではそれらは等しくなければならないと明示的に述べていますか?

更新:平等は期待どおりに機能します。上記のコードサンプルは関係ありません。以下の私の答えを参照してください。

4

2 に答える 2

5

私自身の質問に答える(これは無関係です)。

すべての同等性チェックは期待どおりに機能します(ドキュメントで説明されています)。
それがうまくいかなかった理由は、私が走っていてautotest、何かがキャッシュされている可能性があるか、または今は説明できない他の神話上の理由であると思います。

要約すると、次のすべてのアサーションは実際に合格しています。

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)
于 2011-03-16T22:49:04.227 に答える
4

定義を詳しく見てください。新しいレコードは、定義上、他のレコードとは異なることに注意してください

この場合、ARは通常、ID列に対して同等性チェックを行うだけなので、#attributesがそれぞれに対して返す結果を比較することで、2つのオブジェクトを比較できます。

于 2011-03-16T15:02:59.427 に答える