如何按用户数创建排序?
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 users
和 users 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.
已经给出了上面的解释
我有模型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 users
和 users 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)
}