【问题标题】:bizarre ActiveRecord equality issue奇怪的 ActiveRecord 平等问题
【发布时间】: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 &lt;=&gt;(other) 吗?
  • 您是否在模型定义中自定义了主键? ActiveRecord 对象的相等性是通过比较对象的标识列/属性来完成的。这不是逐个属性比较的属性。至少这是我的理解……
  • 克里斯就是这样。 facepalms 想要将其发布为答案以便我确认吗?

标签: ruby-on-rails activerecord equality


【解决方案1】:

正如 Chris Heald 在上面的 cmets 中指出的那样,比较运算符 确实是在 ChallengeClaim 上定义的!

【讨论】: