странная проблема с равенством ActiveRecord

#ruby-on-rails #activerecord #equality

#ruby-on-rails #activerecord #равенство

Вопрос:

Я исправил это для своего реального приложения довольно тривиально, переопределив оператор ==, но это сводит меня с ума, и я не смог найти объяснение. Насколько я знаю, ActiveRecord должен определять равенство двух существующих записей только через поле id, верно?

По-видимому, нет!

 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
  

?!?!!??!

Любые объяснения с благодарностью приветствуются, поэтому я снова могу спать по ночам. :>

Комментарии:

1. Вы где-нибудь реализовали def <=>(other) на ChallengeClaim ?

2. вы настроили свой первичный ключ в определении модели? Равенство объектов ActiveRecord выполняется путем сравнения столбца идентификатора / атрибута объектов. Это не сравнение атрибута с атрибутом. По крайней мере, я так понимаю…

3. Крис, это было полностью. facepalms Хотите опубликовать это в качестве ответа, чтобы я мог это подтвердить?

Ответ №1:

Как указал Крис Хилд выше в комментариях, действительно, оператор сравнения <=> был определен в ChallengeClaim!