好吧,我完全被这个难住了。我正在尝试构建按类别组织的已发布网页的菜单。
类别.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
页面.rb
belongs_to :category
Page 模型也有 :is_published,所以我也在尝试过滤它。我不愿意发布我微弱的查询尝试,但除了乞求更聪明的人之外,没有其他解决方案:
(自己是@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
提前感谢您对此的任何帮助。我正在尝试尽可能多地了解查询,但我在这方面遇到了困难。
更新:实施 KandadaBoggu 的建议产生了更好的结果,这被添加到 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?}
再次感谢您的帮助。