gpt4 book ai didi

ruby-on-rails - 子查询的 sort_by 花费的时间太长

转载 作者:搜寻专家 更新时间:2023-10-30 20:17:45 27 4
gpt4 key购买 nike

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

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

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

澄清一下,badge_instancerecord 的子项。我可以使用哪些 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")

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

关于ruby-on-rails - 子查询的 sort_by 花费的时间太长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28487671/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com