ruby-on-rails - 使用条件 Rails 按计数范围排序

标签 ruby-on-rails sorting count scope conditional-statements

我有一个型号Categoryhas_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/

相关文章:

ruby-on-rails - 生产中的 Rails Resque worker - 将 Redis 服务器放在哪里?

ruby-on-rails - 指定 anchor 时,路径助手将 "/search?option=..."更改为 "/search.option=..."

c - stdlib qsort 对指向结构的指针数组进行排序

c++ - [C++14]我正在使用 pair 但没有输出

ruby-on-rails - 为什么要将 Assets 直接上传到 S3?

ruby-on-rails - 在 Rails 中按字母顺序排序

java - Java如何对数据集进行排序

sql-server - 计算行数而不发出单独的计数

Mysql:每行中一个值出现多少次

php - 我的 SELECT COUNT 查询返回一个数组而不是整数