【问题标题】:Is there a more efficient way to order an array based on how many associations each record has?有没有更有效的方法来根据每条记录有多少关联对数组进行排序?
【发布时间】:2015-04-30 18:34:29
【问题描述】:

我有一个模型 Item,它有很多其他模型 Vote。我有一个Item 的方法,叫做vote_count

def vote_count
  self.votes.count
end

我正在打印投票最多的 10 个项目的列表:

Item.all.sort_by(&:vote_count).reverse.first(10)

此方法有效,但速度相当慢,因为服务器必须加载数据库中的每一个投票。有谁知道更有效的方法吗?

我不能只创建一个在每次创建投票时增加 1 的列,因为投票会在 7 天后使用 default_scope 软删除。

【问题讨论】:

    标签: mysql sql ruby-on-rails ruby database


    【解决方案1】:

    能否也用SQL表达软删除的逻辑?

    最好的办法是在数据库中使用 ORDER BY,由此您可以通过 GROUP BY ITEMS.ID 和 SQL 聚合函数排序...

    order("sum(case when vote.created_at >= ... then 1 else 0 end)")
    

    不知道 MySQL 的语法,但它可能会做这样的事情,而且它会比 Rails 方法快得多。

    【讨论】:

      【解决方案2】:

      最好的办法是对数据库中的记录进行排序和限制,然后将最后的 10 个结果加载到 rails 中。你可以试试这样的:

      Item.order('vote_count desc').limit(10)
      

      如果我猜错了相反的顺序,您可能需要将“desc”更改为“asc”。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-06-27
        • 1970-01-01
        • 2015-07-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-11
        相关资源
        最近更新 更多