Как получить наибольшее количество связанных моделей (Rails)? - PullRequest
9 голосов
/ 16 марта 2012

Пользователь has_many Solutions

Как заказать пользователей тем, у кого больше всего решений?

Я пытаюсь найти десятку пользователей, но я не уверен, как наиболее аккуратный или эффективный способ сделать это?

У кого-нибудь есть пример, который не слишком дорог для вычислений?

Ответы [ 3 ]

21 голосов
/ 16 марта 2012
User
  .joins(:solutions)
  .select("users.*, count(solutions.id) as scount")
  .group("users.id")
  .order("scount DESC")
5 голосов
/ 16 марта 2012

Если вы действительно хотите быстрый способ сделать это, поместите counter_cache в решения пользователя (в вашем User столбце solutions_count) и упорядочите по этому столбцу. Вам не нужно управлять этим счетчиком, потому что Rails делает это за вас. Подробнее о counter_cache можно прочитать в Направляющих рельсов

4 голосов
/ 16 марта 2012

При условии, что следующие модели

class User
  has_many :solutions
end

class Solution
 belongs_to :user
end

Тогда лучший способ - это противостоять кешу solutions_count и упорядочить его. больше на counter_cache

Тогда запрос будет

User.order("users.solutions_count DESC").limit(10)

Не забудьте проиндексировать столбец solutions_count.

...