2011-11-07 65 views
1

我已經通過覆蓋==運算符相當平凡地修復了我的實際應用程序,但它驅使我瘋了,我一直無法找到解釋。據我所知,ActiveRecord應該通過id字段確定兩個現有記錄的相等性,對吧?奇怪的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'上執行過'def <=>(other)'嗎? –

+2

您是否在模型定義中定製了您的主鍵?通過比較對象的標識列/屬性來完成ActiveRecord對象的平等。這不是屬性比較的屬性。至少這是我的理解...... – jaydel

+0

克里斯,完全是它。 * facepalms *要發佈作爲答案,所以我可以確認它? – shalott

回答

0

正如Chris Heald在評論中指出的那樣,比較運算符< =>是在ChallengeClaim上定義的!