根据ActiveRecord::Base的文档:
==(comparison_object) 如果 compare_object 是同一个确切的对象,或者 compare_object 是相同的类型并且 self 有一个 ID 并且它等于 comparison_object.id,则返回 true。
请注意,根据定义,新记录不同于任何其他记录,除非其他记录是接收者本身。此外,如果您使用 select 获取现有记录并忽略 ID,则您只能靠自己,此谓词将返回 false。
另请注意,销毁记录会在模型实例中保留其 ID,因此删除的模型仍然具有可比性。
但我的观察表明,它只比较实例,而不是 id,因此以下是正确的:
a = Factory.create(:user)
b = User.find_by_email(a.email) # b is logically same as a
a.id.should == b.id # All good
a.should == b # FAILS: Contradicts the docs
a.should_not == b # Contradicts the docs
a.should_not eql b # Contradicts the docs
问题是 2 个 AR 实例被认为是不同的,而文档明确表示它们应该相等?
更新:平等确实按预期工作。上面的代码示例无关紧要。请看下面我的回答。