Как создать сортировку по количеству пользователей? - PullRequest
0 голосов
/ 01 марта 2020

У меня есть модель lesson. И связанная модель user. И я хочу добавить сортировку по количеству пользователей к уроку. Я думал сделать что-то вроде этого:

lesson.rb

scope :popular, -> { order("users ASC") }

Но это не работает.

Ответы [ 3 ]

3 голосов
/ 01 марта 2020

В вашей lesson модели сделайте это

scope :popular, -> { left_joins(:users).group(:id).order('COUNT(users.id) DESC') }

Я предположил, что lessons have_many users и users belongs_to lesson

2 голосов
/ 01 марта 2020

Я бы начал с чего-то вроде этого:

scope :popular, -> { 
  left_outer_joins(:users).group('lessons.id').order('COUNT(users.id) DESC')
}

Объяснение:

  • left_outer_joins вместо просто join, чтобы также включать уроки без каких-либо пользователей
  • group для возврата каждого урока только один раз, даже если нескольким пользователям назначено
  • count для подсчета количества пользователей на урок (работает только в комбинации с group
  • DESC в счетчике, чтобы сначала вернуть популярные уроки (с большим количеством)
1 голос
/ 02 марта 2020

Вместо использования литерала SQL для группировки вы также можете использовать драгоценный камень арела.

scope :popular, -> {
  left_joins(:users).group(:id).order(User.arel_table[:id].count.desc)
}

Объяснение вышесказанному уже дано ответом spickermann так что я оставлю это Вы можете найти документацию по аренде здесь .

...