Rails - проблема с именованной областью (зависит от количества дочерних элементов в отношении many_to_many) - PullRequest
1 голос
/ 08 февраля 2011

Допустим, у меня есть отношения многие ко многим между пользователями и группами. Пользователь может быть членом группы, или его приложение все еще ожидает рассмотрения.

class User < ActiveRecord::Base
  has_many :applications
  has_many :groups, :through => :applications
end

class Group < ActiveRecord::Base
  has_many :applications
  has_many :users, :through => :applications
end

class Application < ActiveRecord::Base
  belongs_to :user
  belongs_to :group
  attr_accessible :pending # boolean : is the application still pending or not
end

Я хочу добавить область в свой класс группы, чтобы выбрать группы, у которых более 10 не ожидающих пользователей.

Я могу получить таких членов, как это

Group.joins(:applications).where('applications.pending = ?', false)

Но я не нашел достаточно ресурсов для создания области, которая подсчитывает количество результатов этого запроса и возвращает группы, в которых это число больше 10

Если у вас есть решение или ресурсы по этой теме, это очень мне поможет

1 Ответ

2 голосов
/ 08 февраля 2011

Я не указывал ваши модели в своей консоли, но разве не сработало бы что-то подобное?

Group.joins(:applications).group('groups.id').having('COUNT(*) > 10').where(["applications.pending = ?", false])

По сути, как только вы включите условия GROUP BY в базовый SQL, вы можете использовать HAVING для совокупных результатов. ГДЕ просто ограничивает это теми результатами, которые вы ищете. Вы можете достичь того же результата, используя прямой SQL:

Group.find_by_sql(["SELECT * FROM groups INNER JOIN applications ON applications.group_id = groups.id WHERE applications.pending = ? GROUP BY groups.id HAVING COUNT(*) > ?", false, 10])

Вид огромного запроса для включения в именованную область. Возможно, вы захотите разбить это на части - это может сэкономить много головной боли позже ...

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