测试ActiveRecord :: Relation的相等性

时间:2015-10-30 16:59:27

标签: ruby-on-rails

我有两个ActiveRecord:Relation个对象:

actual
#=> #<ActiveRecord::Relation [#<AdmTep id: 587730567, Student_Bnum: "145919559", Program_ProgCode: "750600237", BannerTerm_BannerTerm: 201511, Attempt: 1, GPA: 2.75, GPA_last30: 3.0, EarnedCredits: 30, PortfolioPass: nil, TEPAdmit: true, TEPAdmitDate: nil, Notes: nil, letter_file_name: "letter.docx", letter_content_type: nil, letter_file_size: nil, letter_updated_at: nil>]>
expected
#=> #<ActiveRecord::Relation [#<AdmTep id: 587730567, Student_Bnum: "145919559", Program_ProgCode: "750600237", BannerTerm_BannerTerm: 201511, Attempt: 1, GPA: 2.75, GPA_last30: 3.0, EarnedCredits: 30, PortfolioPass: nil, TEPAdmit: true, TEPAdmitDate: nil, Notes: nil, letter_file_name: "letter.docx", letter_content_type: nil, letter_file_size: nil, letter_updated_at: nil>]>

每个记录包含一条记录,这些记录通过==测试,

actual.size #=> 1
expected.size #=> 1
actual.first == expected.first #=> true

ActiveRecord::Relation个对象没有:

actual == expected #=> false

我无法理解为什么两个ActiveRecord::Relation对象没有通过==测试。谁能帮我理解为什么?

1 个答案:

答案 0 :(得分:5)

值得注意的是ActiveRecord::Relation只定义了一个数据库查询。它仅包含有关where条件,limitjoins等条款的信息。但是在实际请求结果之前不会执行该查询。

因此,在一定条件下最终返回相同结果的两个关系不被视为相等是有道理的。因为在另一个条件下运行这两个查询可能会返回不同的结果:可能是因为它们返回时间戳或返回是随机排序的。

一旦需要结果,就会执行查询:例如,当您致电eachall时。或者在您的示例中:sizefirst。查询运行后,将返回实际结果(而不再是Relation对象)。因此,以后的所有比较都会返回true