Упорядочить по количеству с условиями Rails - PullRequest
0 голосов
/ 10 февраля 2019

У меня есть модель Category, которая has_many Pendencies.Я хотел бы создать область, которая упорядочит категории по количеству 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.

Спасибо за помощь.

Ответы [ 3 ]

0 голосов
/ 12 февраля 2019

На данный момент я разработал следующее (это работает, но я считаю, что это не лучший способ):

  scope :order_by_pendencies, -> { scoped = Category.left_joins(:pendencies)
                                            .group(:id)
                                            .order('COUNT(pendencies.id) DESC')
                                            .where('pendencies.active = ?', true)
                                   all = Category.all
                                   (scoped + all).uniq}
0 голосов
/ 12 февраля 2019

Полагаю, вы хотите отсортировать по количеству активных смещений, не игнорируя категории, у которых нет слагаемых.

Это может выглядеть примерно так:

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

Обратите внимание, что если для категории нет активных ограничений, то счетчик будет нулевым и будет добавлен в конец списка.Аналогичный подзапрос может быть добавлен для дополнительной сортировки по общему количеству отклонений ...

0 голосов
/ 11 февраля 2019

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;

Мы должны вывести ActivePendnecies в SQL, даже если код выбросит его, потому что в противном случаеоптимизатор имеет право выбросить ORDER BY.

...