如何按用户数创建排序?

How to create sort by users count?

我有模型lesson。和关联模型 user。 我想在课程中添加按用户数排序。 我想做这样的事情:

lesson.rb

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

但是不行。

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

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

我在这里假设 lessons have_many usersusers belongs_to lesson

我会从这样的事情开始:

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

解释:

  • left_outer_joins 而不仅仅是 join 以包含没有任何用户的课程
  • group 到 return 每节课只有一次,即使分配了多个用户也是如此
  • count 计算每节课的用户数量(仅与 group
  • 结合使用
  • DESC 个排名第 return 个热门课程(计数较高)第一个

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

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

, so I'll leave that out. You can find the arel documentation here.

已经给出了上面的解释