Хорошо, я полностью озадачен этим. Я пытаюсь создать меню из опубликованных веб-страниц, организованных по категориям.
Category.rb:
belongs_to :parent, :class_name => "Category", :foreign_key => "parent_id"
has_many :children, :class_name => "Category", :foreign_key => "parent_id"
has_many :pages, :documents, :galleries
Page.rb
belongs_to :category
Модель страницы также имеет: is_published, поэтому я тоже пытаюсь отфильтровать это. Я не хочу публиковать свои слабые попытки запроса, но не вижу другого решения, кроме как умолять намного умнее людей:
(self - @current_website)
self.categories.includes(:children, :pages).where('pages.is_published = 1')
Это возвращает в основном то, что мне нужно, но не родительские категории без опубликованных страниц. Например, это прекрасно работает, если у меня есть:
Parent Category
- Published Page
- Child Category
-- Published Page
Где это терпит неудачу, когда у меня нет опубликованных страниц в родительском, как это:
Parent Category
- Child Category
-- Published Page
- Child Category
-- Published Page
Заранее спасибо за любую помощь в этом. Я пытаюсь узнать как можно больше о запросах, но я против этого.
ОБНОВЛЕНИЕ: Реализация предложения Кандада Боггу дала гораздо лучшие результаты, это было добавлено в Category.rb
has_many :published_pages, :class_name => "Page",
:conditions => {:is_published => true}
Однако при использовании следующего:
self.categories.where(:parent_id => nil).includes({:children => :published_pages},
:published_pages)
Я получаю результаты, которые мне нужны, но я также получаю пустые Родительские категории (нет опубликованных_страниц, дочерних категорий с опубликованными страницами. Пример:
- Parent Category
-- Published Page
- Parent Category
-- NOTHING
Мое временное исправление заключалось в добавлении запроса с помощью:
reject{|category| category.pages.empty? && category.children.empty?}
Еще раз спасибо за вашу помощь.