【问题标题】:How to create sort by users count?如何按用户数创建排序?
【发布时间】:2020-03-01 14:13:46
【问题描述】:

我有模型lesson。以及关联模型user。 我想在课程中添加按用户计数排序。 我想这样做:

课程.rb

scope :popular, -> { order("users ASC") }

但它不起作用。

【问题讨论】:

    标签: ruby-on-rails ruby rails-activerecord


    【解决方案1】:

    在您的 lesson 模型中执行此操作

    scope :popular, -> { left_joins(:users).group(:id).order('COUNT(users.id) DESC') }
    

    我在这里假设lessons have_many usersusers belongs_to lesson

    【讨论】:

      【解决方案2】:

      我会从这样的开始:

      scope :popular, -> { 
        left_outer_joins(:users).group('lessons.id').order('COUNT(users.id) DESC')
      }
      

      解释:

      • left_outer_joins 而不仅仅是 join 还包括没有任何用户的课程
      • group 即使分配了多个用户,每节课也只返回一次
      • count 计算每节课的用户数(仅与 group 结合使用
      • 计数中的DESC 优先返回热门课程(计数较高)

      【讨论】:

        【解决方案3】:

        除了使用 SQL 文字进行分组,您还可以使用 arel gem。

        scope :popular, -> {
          left_joins(:users).group(:id).order(User.arel_table[:id].count.desc)
        }
        

        answer of spickermann 已经给出了对上述内容的解释,所以我将省略它。您可以找到 arel 文档here

        【讨论】:

          猜你喜欢
          • 2015-07-13
          • 1970-01-01
          • 1970-01-01
          • 2011-07-02
          • 2020-10-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多