Вложенные рельсы для вложенных соединений, где содержится счетчик вложенной таблицы соединений - PullRequest
2 голосов
/ 03 ноября 2011

В моем приложении rails 3 установлена ​​следующая модель:

class User << AR::Base
  has_many :groups
end

class Group << AR::Base
  belongs_to :user
  has_many :memberships
  has_many :contacts, :through => :memberships
end

class Membership << AR::Base
  belongs_to :group
  belongs_to :contact
end

class Contact << AR::Base
  has_many :memberships
  has_many :groups, :through => :memberships
end

Я пытаюсь разгрузить как можно большую часть этого запроса в базу данных, но я пытаюсь получить список пользователей, у которых есть более чем 1004 * число контактов через их (потенциально много) групп.

Я могу сделать это с помощью кода ruby ​​/ rails без проблем, но он загружает все в память, что может быть проблемой для больших наборов данных.

x = 4 # or whatever
User.all.select{ |u| u.groups.collect(&:contacts).flatten.uniq.size > x }

Я пытался сделать что-то вроде следующего, но безрезультатно:

User.joins(:groups => :contacts).where('count(contacts.id) > ?', x)

Также было бы неплохо, чтобы контакты были отчетливыми

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

1 Ответ

9 голосов
/ 04 ноября 2011

После некоторой борьбы с этим я получил некоторую помощь и смог завершить свой запрос примерно так

User.select("users.*, count(distinct contacts.id) as num").joins(:groups => :contacts).group('users.id').having('num > 10')
...