Rails - проблема с именованной областью (зависит от количества дочерних элементов в отношении many_to_many)
Допустим, у меня есть отношения многие ко многим между пользователями и группами. Пользователь может быть членом группы, или его приложение все еще может находиться на рассмотрении.
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 ответ
Я не описывал ваши модели в своей консоли, но разве не сработало бы что-то подобное?
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])
Вид огромного запроса для включения в именованную область. Возможно, вы захотите разбить это на части - это может сэкономить много головной боли позже...