sort_by 子查询耗时过长

sort_by with subquery taking too long

我正在尝试优化从此 RoR 代码呈现的查询:

records.sort_by { |r| r.badge_instances.count }.reverse.each do |s|

这会产生 N+1 个查询,因为对于每个 record,都需要一个 COUNT 来进行排序。

澄清一下,badge_instance 是 children 到 record。我可以使用哪些 rails 方法来呈现获取所有徽章实例计数的查询,并保持与每个 record 关联的计数进行排序?

非常感谢您的帮助!

您可以在获取记录时执行一次查询,然后使用 size 而不是 count 来防止 N+1 查询:

records = Record.include(:badge_instances).where(...)

records.sort_by { |r| r.badge_instances.size }.reverse.each do |s|
  ...
end

在与@MrYoshiji 的交谈中,如果这些表中的任何一个变得非常大,那么这可能会成为一个内存消耗大户(因为这些对象的所有实例都将被加载到内存中。在这种情况下,一个替代方案可以将关联记录的计数作为属性包含在查询中:

records = Record.select("records.*, COUNT(badge_instances.id) as badge_instances_count").joins(:badge_instances).group("records.id")

然后您将可以访问每个 records 上名为 badge_instances_count 的属性,您可以使用该属性按计数的大小对记录进行排序。注意badge_instances_count会是一个字符串,所以需要将其转换为整数才能按实际计数排序。