我有一个型号Category
那has_many
Pendencies
.我想创建一个范围,按具有 active = true
的挂起数量对类别进行排序不排除 active = false
.
到目前为止,我所拥有的是:
scope :order_by_pendencies, -> { left_joins(:pendencies).group(:id).order('COUNT(pendencies.id) DESC')}
这将按未决数排序,但我想按具有
active = true
的未决数排序.另一种尝试是:
scope :order_by_pendencies, -> { left_joins(:pendencies).group(:id).where('pendencies.active = ?', true).order('COUNT(pendencies.id) DESC')}
这将按具有
pendencies.active = true
的挂起数排序, 但将排除 pendencies.active = false
.感谢您的帮助。
最佳答案
我猜您想按事件挂起的数量进行排序,而不忽略没有事件挂起的类别。
那将是这样的:
scope :order_by_pendencies, -> {
active_count_q = Pendency.
group(:category_id).
where(active: true).
select(:category_id, "COUNT(*) AS count")
joins("LEFT JOIN (#{active_count_q.to_sql}) AS ac ON ac.category_id = id").
order("ac.count DESC")
}
等效的 SQL 查询:
SELECT *, ac.count
FROM categories
LEFT JOIN (
SELECT category_id, COUNT(*) AS count
FROM pendencies
GROUP BY category_id
WHERE active = true
) AS ac ON ac.category_id = id
ORDER BY ac.count DESC
请注意,如果某个类别没有事件的未决项,则计数将为空,并将添加到列表的末尾。
可以添加一个类似的子查询,以额外按未决总数排序...
关于ruby-on-rails - 使用条件 Rails 按计数范围排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54611318/