当前位置: 首页 > 面试题库 >

Rails 3-有条件的渴望加载

潘青青
2023-03-14
问题内容

好吧,我对此完全感到困惑。我正在尝试构建按类别组织的已发布网页菜单。

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_pa​​ges,没有带有已发布页面的子类别。例如:

- Parent Category
-- Published Page
- Parent Category
-- NOTHING

我的临时解决方法是在查询中附加以下内容:

reject{|category| category.pages.empty? && category.children.empty?}

再次感谢您的帮助。


问题答案:

添加一个新的关联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行)。我在下面列出了相关的代码段:

例如

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)


 类似资料:
  • 我有一个问题,就是基于hasMany关系从数据库中获取数据并将其发送到Larave中的api。在下面的代码中,Laravel没有给我客户id=$id的产品。我不知道为什么,我不能在$query旁边发送$id。如果我把号码写在“我有很好的安全套,但我需要自动拿。 所有api代码 先谢谢你。

  • 问题内容: SQLAlchemy支持渴望加载关系,这基本上是一条语句。但是,如果模型具有两个或多个关系,则可能是非常庞大的联接。例如, 该查询的性能实在是太差了,因为中和会产生一个巨大的表。但是和在这里没有关系,因此它们不应该是。它应该是两个分开的查询。并且由于会话具有某种程度的缓存,因此我将查询更改为此。 这次的性能要好得多。但是,我不认为这样做是正确的。我不确定会话结束时标签缓存是否会过期。

  • 我已经阅读了本教程和这篇文章,但我不明白每种加载类型的确切用途。 我解释 我有这个POCO: 我明白这一点: > 对于懒惰加载:因为加载是懒惰的,如果我调用dbset将不会加载所有导航属性。这种类型的加载在性能和响应性方面是最好的。默认情况下启用它,如果我想重新启用它,我必须设置: 对于即时加载,它不是懒惰的:当我加载dpc\u-gestion时,它加载了所有导航属性。可以使用方法加载导航属性。要

  • 我有以下三个表格: 帖子 帖子: 评论: 标签: Post表有许多注释,comments表有许多与之关联的标记。 如何使用“快速加载”将所有这些表组合在一起? 比如: 但是这个查询总是在标记关系中返回空响应。 我做错了什么? 期望的结果是这样的: 你可以看到帖子里面包含评论,评论里面也包含标签关系。 另外,我在我的项目中使用了“jenssegers/laravel mongodb”包,我试图在没有

  • 我正在建立一个小博客,我想使用内置的雄辩的渴望加载,但我希望它作为一个明确的加入。 下面是我试图做的,使用连接,它可以工作,但不是我想要的方式。 我的问题是,我不能像这样在我的帖子中使用用户模型: $帖子[0]- 通过连接,用户的数据直接设置在post模型上,因此我必须像这样使用它: $帖子[0]- 问题是:我想使用我的用户模型,因为它里面有一些我想使用的方法。一个用于打印全名,一个用于打印其网址

  • 我正在使用教义2来绘制学术时间表。以下是对这些关系的简化观察: 一个类有事件(一对多) 事件具有类型(多对一) 一个事件有一个位置(多对一) 使用