2012-03-01 3 views
1

Я не совсем уверен, что даже искать для решения этого конкретного вопроса. Так здесь идет ...Подмножество вложенного запроса

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

User < AR 
    has_many :items 
    has_many :projects 

Project < AR 
    has_many :groups 

Group < AR 
    has_many :items 

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

Это похоже на то, что нужно позаботиться в модели, а не как логика контроллера, но я не уверен, что лучший способ 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 
+0

Может ли «группа» принадлежать нескольким проектам? Ваш вопрос подразумевает, что, но ваш дизайн модели этого не делает. –

+0

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

+0

@ Группа KandadaBoggu не может принадлежать нескольким проектам. – Stefan

ответ

0

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

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; в противном случае вам, вероятно, придется написать метод!

+0

Это на самом деле то, что у меня есть сейчас, но я хотел бы получить коллекцию групп и иметь эти группы только элементы, связанные с данным пользователем, а не все элементы, которые обычно могут содержать группы. Думаю, я мог бы перебирать группы @ project.groups и повторно заполнять коллекцию предметов каждой группы, но кажется, что есть лучший способ. – Stefan

0

Это немного сырой 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

Я попробую сегодня, но похоже, что он должен работать. Я сблизился с .include и .where, но я что-то упустил. Это похоже на то, что мне не хватало. Получит ли он группу, даже если у нее нет элементов для данного пользователя? – Stefan

+0

Это не должно получить группу, если у нее нет элементов для данного пользователя, потому что вызов join (: items) создает INNER JOIN в SQL. –

Смежные вопросы