我有两个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
对象没有通过==
测试。谁能帮我理解为什么?
答案 0 :(得分:5)
值得注意的是ActiveRecord::Relation
只定义了一个数据库查询。它仅包含有关where
条件,limit
,joins
等条款的信息。但是在实际请求结果之前不会执行该查询。
因此,在一定条件下最终返回相同结果的两个关系不被视为相等是有道理的。因为在另一个条件下运行这两个查询可能会返回不同的结果:可能是因为它们返回时间戳或返回是随机排序的。
一旦需要结果,就会执行查询:例如,当您致电each
或all
时。或者在您的示例中:size
或first
。查询运行后,将返回实际结果(而不再是Relation
对象)。因此,以后的所有比较都会返回true
。