Rails 3 - Активная загрузка с условиями

Хорошо, я полностью в тупике. Я пытаюсь создать меню из опубликованных веб-страниц организовано по категориям.

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 is @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?}

Еще раз спасибо за вашу помощь.

10
задан tereško 9 February 2013 в 20:18
поделиться