Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 按计数的范围顺序和条件_Ruby On Rails_Sorting_Count_Scope_Conditional Statements - Fatal编程技术网

Ruby on rails 按计数的范围顺序和条件

Ruby on rails 按计数的范围顺序和条件,ruby-on-rails,sorting,count,scope,conditional-statements,Ruby On Rails,Sorting,Count,Scope,Conditional Statements,我有一个模型类别,有许多悬而未决。我想创建一个作用域,按照具有active=true的悬而未决的数量对类别进行排序,而不排除active=false 到目前为止,我得到的是: scope :order_by_pendencies, -> { left_joins(:pendencies).group(:id).order('COUNT(pendencies.id) DESC')} 这将按未决数排序,但我想按active=true的未决数排序 另一种尝试是: scope :order_by

我有一个模型
类别
有许多
悬而未决
。我想创建一个作用域,按照具有
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数量排序,但将排除
pendencies.active=false

谢谢您的帮助。

C#根据要求回答:

method() {
    ....OrderBy((category) => category.Count(pendencies.Where((pendency) => pendency.Active))
}
或者在直接SQL中:

SELECT category.id, ..., ActivePendnecies
  FROM (SELECT category.id, ..., count(pendency) ActivePendnecies
          FROM category
          LEFT JOIN pendency ON category.id = pendency.id AND pendnecy.Active = 1
          GROUP BY category.id, ...) P
 ORDER BY ActivePendnecies;

我们必须在SQL中输出
activependencies
,即使代码会抛出它,因为否则优化器有权按

抛出
顺序,因为现在我开发了以下内容(它正在工作,但我相信这不是最好的方式):


我猜您希望按活动悬而未决的数量进行排序,而不忽略没有活动悬而未决的类别

这大概是:

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
请注意,如果某个类别没有活动的待决项,则计数将为空,并将添加到列表的末尾。
可以添加一个类似的子查询,以根据待决项的总量进行额外排序…

Hey man。订单标签上写着不要使用。我不太明白你的问题,但标签得挂了。你好,约书亚。谢谢你的回答。我真的不明白你说的订单标签是什么意思。我的问题是:假设我有以下情况:类别1有10个悬而未决(2个活动=真,8个活动=假);第2类,有8个悬而未决(6个有效=正确,2个有效=错误);类别3有15个悬而未决(15个活动=假)我希望顺序是:类别2,类别1,类别3I可以用C#解决这个问题。对不起,我不认识鲁比。谢谢你的努力,朱舒亚。你能用C写下你的答案吗?如果我看到它,也许我能有一个洞察力
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