【发布时间】:2020-03-01 14:13:46
【问题描述】:
我有模型lesson。以及关联模型user。
我想在课程中添加按用户计数排序。
我想这样做:
课程.rb
scope :popular, -> { order("users ASC") }
但它不起作用。
【问题讨论】:
标签: ruby-on-rails ruby rails-activerecord
我有模型lesson。以及关联模型user。
我想在课程中添加按用户计数排序。
我想这样做:
课程.rb
scope :popular, -> { order("users ASC") }
但它不起作用。
【问题讨论】:
标签: ruby-on-rails ruby rails-activerecord
在您的 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 即使分配了多个用户,每节课也只返回一次count 计算每节课的用户数(仅与 group 结合使用
DESC 优先返回热门课程(计数较高)【讨论】:
除了使用 SQL 文字进行分组,您还可以使用 arel gem。
scope :popular, -> {
left_joins(:users).group(:id).order(User.arel_table[:id].count.desc)
}
answer of spickermann 已经给出了对上述内容的解释,所以我将省略它。您可以找到 arel 文档here。
【讨论】: