好吧,我对此完全感到困惑。我正在尝试构建按类别组织的已发布网页菜单。
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
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)
我得到了所需的结果,但我也得到了空的“父类别”(没有Published_pages,没有带有已发布页面的子类别。例如:
- Parent Category -- Published Page - Parent Category -- NOTHING
我的临时解决方法是在查询中附加以下内容:
reject{|category| category.pages.empty? && category.children.empty?}
再次感谢您的帮助。
添加一个新的关联published_pages(除了当前的关联之外)
published_pages
class Category has_many :children, :class_name => "Category", :foreign_key => "parent_id" has_many :published_pages, :class_name => "Page", :conditions => { :is_published => true } end
现在,您可以获取所有类别,如下所示:
self.categories.includes(:children, :published_pages)
如果您有兴趣了解为什么您的方法行不通,请阅读Rails 文档(在本Eager loading of associations节后滚动10-15行)。我在下面列出了相关的代码段:
Eager loading of associations
例如 Post.includes([:author, :comments]).where(['comments.approved = ?', true]).all 这将导致单个SQL查询的连接符合以下内容: LEFT OUTER JOIN comments ON comments.post_id = posts.id and LEFT OUTER JOIN authors ON authors.id = posts.author_id. 请注意,使用这样的条件可能会产生意想不到的后果。在上面的示例中,根本没有返回带有概念批准的注释的帖子,因为这些条件不仅适用于整个SQL语句,而且还适用于整个SQL语句。您必须消除列引用的歧义,以使此后备发生,例如::order =>“ author.name DESC”将起作用,但:order =>“ name DESC”将不起作用。
例如
Post.includes([:author, :comments]).where(['comments.approved = ?',
true]).all
这将导致单个SQL查询的连接符合以下内容:
LEFT OUTER JOIN comments ON comments.post_id = posts.id and LEFT OUTER JOIN authors ON authors.id = posts.author_id.
请注意,使用这样的条件可能会产生意想不到的后果。在上面的示例中,根本没有返回带有概念批准的注释的帖子,因为这些条件不仅适用于整个SQL语句,而且还适用于整个SQL语句。您必须消除列引用的歧义,以使此后备发生,例如::order =>“ author.name DESC”将起作用,但:order =>“ name DESC”将不起作用。
要渴望加载关联的过滤行,请对条件使用关联:
class Post < ActiveRecord::Base has_many :approved_comments, :class_name => 'Comment', :conditions => ['approved = ?', true] end Post.find(:all, :include => :approved_comments)