2011-11-07 8 views
1

私は実際のアプリケーションでこれを==演算子をオーバーライドすることでかなり修正しましたが、それはナットを運転しており、説明を見つけることができませんでした。私が知る限り、ActiveRecordはidフィールド経由で2つの既存のレコードの等価性を判断することになっています。bizarre ActiveRecord平等問題

明らかに、いいえ!

Loading development environment (Rails 3.0.4) 
irb(main):001:0> c = ChallengeClaim.find(1) 
=> #<ChallengeClaim id: 1, collection_id: 954, creation_id: nil, creation_type: nil, request_signup_id: 2, request_prompt_id: 5, claiming_user_id: 8, sent_at: nil, fulfilled_at: nil, defaulted_at: nil, created_at: "2011-09-23 04:39:07", updated_at: "2011-09-23 04:39:07"> 
irb(main):002:0> c2 = ChallengeClaim.find(2) 
=> #<ChallengeClaim id: 2, collection_id: 954, creation_id: nil, creation_type: nil, request_signup_id: 2, request_prompt_id: 4, claiming_user_id: 8, sent_at: nil, fulfilled_at: nil, defaulted_at: nil, created_at: "2011-11-07 17:47:33", updated_at: "2011-11-07 17:47:33"> 
irb(main):003:0> c == c2 
=> true 

?!?!! ??!

私はもう一度夜に寝ることができるので、感謝して歓迎された説明。 :>

+5

'<=>(その他)'を 'ChallengeClaim'のどこかに実装しましたか? –

+2

モデル定義で主キーをカスタマイズしましたか? ActiveRecordオブジェクトの同等性は、オブジェクトの識別列/属性を比較することによって行われます。属性比較による属性ではありません。少なくともそれは私の理解です... – jaydel

+0

クリスは完全にそれでした。 * facepalms *私はそれを確認できるように答えとして投稿したいですか? – shalott

答えて

0

Chris Healdはコメントの上で指摘したように、確かに比較演算子< =>がChallengeClaimで定義されました!