我有一个活动记录查询,我根据另一个表和where子句的连接选择对象。结果可能包括多次相同的对象,这是期望的行为。
对于我的示例查询,我得到3个结果,其中2行是相同的。
我现在想要加载另一个关联。如果我使用includes
,查询仍会生成3行,但生成的查询不是最理想的:
puts l.count # 3
l = l.includes(:name)
puts l.count #3
puts l.to_a.count #3
通过强制使用eager_load
,生成的查询已经过优化,但不知怎的,我丢失了重复的行:
puts l.count # 3
l = l.eager_load(:name)
puts l.count # 2
puts l.to_a.count #2
奇怪的是,如果我手动执行生成的查询,我会得到3行。这意味着活动记录执行重复数据删除。为什么会发生这种情况并且有办法解决这个问题?
我在实验过程中注意到获得最佳查询(可能与之相关)的一点是l.count
和l.to_a.count
并不总是产生相同的结果:
puts l.count # 3
l = l.joins(:name).includes(:name)
puts l.count # 3
puts l.to_a.count # 2