Как я могу отфильтровать список записей на основе количества одной из их ассоциаций? - PullRequest
1 голос
/ 14 февраля 2012

У меня есть пользователи и задачи, связанные с этими пользователями (принадлежит).Я хотел бы получить количество пользователей с менее чем 5 задачами, связанными с ними.Как бы я поступил так?

Ответы [ 2 ]

0 голосов
/ 14 февраля 2012

Я не уверен, что это работает до 1.9.2, но:

User.where(Task.count > 5).count
0 голосов
/ 14 февраля 2012

Не уверен, есть ли простой способ сделать это, но это должно работать:

User.joins(:tasks).select("users.*, count(*) as task_count").having("task_count < 5").group(:id)

РЕДАКТИРОВАТЬ : приведенное выше возвращает только экземпляры пользователя, которые имеют по крайней мере одну связанную задачу.

То, что вы хотите:

User.joins("LEFT JOIN tasks ON tasks.user_id = users.id").select("users.*, IFNULL(count(tasks.id), 0) AS task_count").having("task_count < 5").group(:id)

Но лучшим решением, вероятно, является просто добавление counter_cache к вашей модели User.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...