【发布时间】:2023-10-18 05:40:01
【问题描述】:
我已经通过重写 == 运算符为我的实际应用程序解决了这个问题,但它让我发疯了,我无法找到解释。据我所知,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
?!?!!??!
非常欢迎任何解释,以便我可以再次入睡。 :>
【问题讨论】:
-
你在
ChallengeClaim上实现了def <=>(other)吗? -
您是否在模型定义中自定义了主键? ActiveRecord 对象的相等性是通过比较对象的标识列/属性来完成的。这不是逐个属性比较的属性。至少这是我的理解……
-
克里斯就是这样。 facepalms 想要将其发布为答案以便我确认吗?
标签: ruby-on-rails activerecord equality