подмножество вложенного запроса - PullRequest
1 голос
/ 01 марта 2012

Я не совсем уверен, что вообще искать, чтобы ответить на этот конкретный вопрос.Итак, вот так ...

Мой текущий дизайн:

User < AR
  has_many :items
  has_many :projects

Project < AR
  has_many :groups

Group < AR
  has_many :items

С учетом @project и @user как мне получить группы для проекта (@project.groups), ноэти группы содержат только items для заданного @user?

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

Редактировать: Возможно, это помогает?

User < AR
  has_many :items
  has_and_belongs_to_many :projects

Project < AR
  has_many :groups
  has_and_belongs_to_many :users

Group < AR
  has_many :items

Ответы [ 2 ]

0 голосов
/ 02 марта 2012

Это немного сырой SQL, но должно работать:

def Project
  def groups_for_user u
    self.groups.select("DISTINCT groups.*").join(:items).where("items.user_id = ?,u.id)
  end
end

Причиной "DISTINCT groups.*" является предотвращение повторений в результате, поскольку вы присоединяетесь к таблице items нижнего уровня.

0 голосов
/ 01 марта 2012

Я думаю, что вы ищете has_many: through:

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

class Project < ActiveRecord::Base
  has_many :groups
end

class Group < ActiveRecord::Base
  has_many :items
end

Тогда вы можете просто позвонить:

@user.items

чтобы получить все предметы для данного пользователя.

Обратите внимание, что вложенные has_many: сквозные переходы работают только с Rails 3.1; в противном случае вам, вероятно, придется написать метод!

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