2013-04-01 3 views
2

В моем приложении у меня есть 3 модели: Item, категория и категоризация определяются следующим образом:Rails запрос включает не работает

class Item < ActiveRecord::Base 
    attr_accessible :name, :description 

    has_many :categorizations 
    has_many :categories, :through => :categorizations 
end 

class Category < ActiveRecord::Base 
    attr_accessible :name, :description, :parent, :children, :items, :parent_id 

    has_many :children, :class_name => "Category", :foreign_key => "parent_id", :dependent => :nullify 
    belongs_to :parent, :class_name => "Category" 

    has_many :categorizations 
    has_many :items, :through => :categorizations 
end 

class Categorization < ActiveRecord::Base 
    attr_accessible :category, :item 

    belongs_to :category 
    belongs_to :item 

end 

Однако, делая это:

Category.where(:parent_id => self.id).includes(:items) 

не вернет меня больше элементы, связанные с категорией. Что мне здесь не хватает?

+1

Что именно означает «не вернет мне предметы, связанные с категорией»?? Что вы ожидаете от происходящего и что происходит? – Mischa

+0

Я ожидал, что могу получить доступ к элементам в категориях, которые были получены где, но: элементы пустые. – Rui

+0

При использовании 'includes' вы можете получить пустые' items'. Если вы хотите только получить категории, в которых есть элементы, вы должны использовать 'joins', что делает внутреннее соединение. – Mischa

ответ

0

Попробуйте это:

Category.where(parent_id: id).joins(:items) 
-1

Попробуйте это:

Category.where(:parent_id => id).collect(&:items) 

Она возвращает элементы всех категорий, соответствующих пункт where.

+0

Весь смысл использования 'includes' предотвращает N + 1 запросов. Это выполнит N + 1 запросов. – Mischa

+0

Тогда вы должны начать с 'Item'. Попробуйте это, 'Item.joins (: категоризация =>: категория) .where ('categories.parent_id' => id)' – KULKING

+0

Нет, вы должны просто использовать 'includes'. В этом нет ничего плохого. – Mischa

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