ActiveRecord对象相等

Dmy*_*iak 5 ruby activerecord rspec ruby-on-rails rspec-rails

根据ActiveRecord :: Base的文档:

==(comparison_object)如果comparison_object是完全相同的对象,或者compare_object属于同一类型且self具有ID并且它等于comparison_object.id,则返回true.

请注意,根据定义,新记录与任何其他记录不同,除非另一记录是接收者本身.此外,如果您使用select获取现有记录并将ID保留,您自己就可以使用,此谓词将返回false.

另请注意,销毁记录会在模型实例中保留其ID,因此已删除的模型仍具有可比性.

但我的观察表明,它只比较实例,而不是ids,以便以下是真实的:

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
Run Code Online (Sandbox Code Playgroud)

问题是2个AR实例被认为是不同的,而文档明确说那些应该是平等的?

更新:平等正如预期的那样工作.上面的代码示例无关紧要.请参阅下面的答案.

Dmy*_*iak 5

回答我自己的问题(这是无关紧要的).

所有相等检查都按预期工作(并在文档中描述).
我认为它对我不起作用的原因是我跑autotest了,可以缓存某些东西或者其他一些我现在无法解释的神话理由.

总而言之,以下所有断言确实都在传递:

a = Factory.create(:user)
b = User.find_by_email(a.email) # b is logically same as a

a.id.should == b.id
a.should == b
a.should eql b
User.find_by_email(a.email).should == User.find_by_email(a.email)
a.should == User.find_by_email(a.email)
b.should == User.find_by_email(a.email)
Run Code Online (Sandbox Code Playgroud)