Tag: eager loading

急于加载“二度”关联对象的麻烦

我正在运行Ruby on Rails 3.1。 我想通过应用一些条件来加载“二度”关联对象,但我遇到了麻烦。 似乎我已经使用以下方法解决了部分问题 : article_categories = article .categories .includes(:comments => [:category_relationships]) .where(:category_relationships => {:user_id => @current_user.id}) 所涉及的课程如下: class Category :comment_relationships … end class Comment :category_relationships … end 上面的代码(似乎做得对): 通过关注has_many :through :category_relationships关联(即通过关注.where(:category_relationships => {:user_id => @current_user.id})条件)加载所有categories ; eager加载所有article.comments.where(:user_id => @current_user.id) 。 但是,我想补充一点: 按照 category_relationships存在的:position属性对检索到的category_relationships进行排序,以便生成的article_categories 按位置排序 ; 急切加载 category_relationship对象,其中user_id == @current_user.id因为上面的代码没有这样做。 如何利用急切的加载来实现这一目标?

如何让Rails获得急切的负载计数?

这与一年前的一个问题有关。 我提出了一个开箱即用的问题示例,只要你有sqlite3可用: https : //github.com/cairo140/rails-eager-loading-counts-demo 安装说明(主分支) git clone git://github.com/cairo140/rails-eager-loading-counts-demo.git cd rails-eager-loading-counts-demo rails s 我在存储库中有更全面的文章,但我的一般问题是这个。 如何以最小化数据库查询的方式使Rails急切加载计数? 只要在关联上使用#count ,就会出现n+1问题,尽管在ActiveRelation中通过#includes(:associated)包含了该关联。 一个解决方法是使用#length ,但只有当它被调用的对象已被加载时才能正常工作,更不用说我怀疑它复制了Rails内部已经完成的东西。 此外,使用#length一个问题是,当开始时没有加载关联并且只需要计数时,它会导致不幸的过载。 从自述文件: 我们可以通过在posts数组上运行#length来避免这个问题(参见附录),这已经加载了,但是也可以随时获得数量。 它不仅更加一致; 它提供了一种访问路径,不一定需要加载post。 例如,如果你有一个部分显示计数,无论什么,但有一半的时间,部分是在加载post和一半时间没有调用,你面临以下情况: 使用#count n已加载post时的COUNT样式查询 n尚未加载post时的COUNT样式查询 使用#length 在已加载post时将其他查询归零 当post尚未加载时,n *样式查询 在这两种选择之间,没有主导选择。 但是修改#count来推迟#length或访问存储在幕后的其他方式的长度会很好,这样我们就可以得到以下场景: 使用修改后的#count 在已加载post时将其他查询归零 n尚未加载post时的COUNT样式查询 那么这里的正确方法是什么? 有没有我忽略的东西(非常非常可能)?

Rails 3限制包含的对象

例如,我有一个博客对象,该博客有很多post。 我想做第一个博客对象的热切加载,并包括说它的前10个post。 目前我会做@blogs = Blog.limit(4) ,然后在视图中使用@blogs.posts.limit(10) 。 我很确定有更好的方法可以通过Blog.include(:posts).limit(:posts=>10) 。 是不是可以限制包含的对象的数量,还是我错过了一些基本的东西?

急于加载和使用’where’方法的麻烦

我正在运行Ruby on Rails 3.1。 我正在使用includes方法,我想了解为什么当我在一个渴望加载的集合上调用where方法时,它会重新加载关联的对象,而不是仅仅在eager加载的集合中找到该对象。 由于所有相关对象都已被急切加载,我希望where方法不会命中数据库来重新加载这些对象! 也就是说,我有以下几点: article_categories = article .categories .where(:user_id => @current_user.id) .includes(:comments) 如果我跑 # CASE 1: article_categories.each do |article_category| article_category.comments.map(&:title) end 急切加载按预期工作:避免了“N + 1查询问题”。 但是,上面的代码还返回没有 “ :user_id == @current_user.id ”的注释标题,但我根本不想检索那些。 所以,因为我认为通过使用热切加载我已经获得所有注释,我使用了另外的where(:user_id => @current_user.id)语句,如下面的代码所示: # CASE 2: article_categories.each do |article_category| article_category.comments.where(:user_id => @current_user.id).map(&:title) end 但是,在这种情况下,急切加载不能按预期工作: 不能避免“N + 1查询问题”…但注释有“ :user_id == @current_user.id ”! 我想用“ […]

Rails:构建涉及多态关联和STI的查询

我正在尝试找到关于照片的10条最新评论,因此我可以将它们集成到我的Rails 3.0.3应用程序的活动源中。 我有一个Photo模型,它inheritance了使用单表inheritance的Upload模型: class Upload < ActiveRecord::Base … end class Photo :commentable … end 可评论的多态关联在Comment模型中描述: class Comment true end 到目前为止一切都那么好吧? 当我尝试构建查询时出现问题。 经过一些试验和错误,我想出了这个代码,它位于Photo模型中: def self.latest_comments(count = 10) Comment.where(:commentable_type => “Upload”)\ .joins(“INNER JOIN uploads ON comments.commentable_id = uploads.id”)\ .where(“uploads.type” => “Photo”).order(“comments.created_at DESC”).limit(count) end 这段代码适用于我的SQLite开发机器,但是我必须做一些修改才能让它在使用PostgreSQL的生产服务器上运行。 上面的查询化身尚未在生产服务器上进行过测试,但我一直在寻找一种更简洁的结构化查询方式,因为上面的内容并不十分健壮,也不像“Railsy”。 我想要的是能够说的是 Comment.joins(:commentable => :photo) …但是这引发了一个exception,大概是因为Rails不知道如何进行连接: ActiveRecord :: EagerLoadPolymorphicError:无法急切加载多态关联:commentable 我在StackOverflow上发表了一篇文章 ,描述了一种查询多态关联的不同方式。 我能够根据这篇文章提出以下代码: Comment.find_all_by_commentable_type(“Upload”, […]

ActiveRecord ::带有急切加载的计算会进行多个数据库查询吗?

我的困惑源于这个问题 ,其中OP有一个类似的模型 class Quote < ActiveRecord::Base has_many :items def calc_price sum = 0 #logic for summation end end 在答案中,有几个人建议直接使用sum方法来计算属性的总和 def total_price items.sum(‘price’) end 如果我急于使用Quote.includes(:items).find(:all)加载数据,那么总和是在数据库结束时发生的,还是使用已经加载到内存中的对象? 如果它使用已在内存中加载的对象,则计算不会卸载到数据库。 它会使数据库查询两次,一次预加载,旁边总结价格吗? 将相同的逻辑扩展到所有ActiveRecord :: Calculations ,如果我进行count或average或其他此类方法,我是否每次都会访问我的数据库?

渴望加载:正确的做事方式

我正在运行Ruby on Rails 3.1。 我阅读了以下关于急切加载的文章和文档,我想找到一个正确的方法来做事: 渴望加载协会 [官方文档] ActiveRecord :: Associations :: ClassMethods (参见“渴望加载关联”一节)[官方文档] 渴望加载 [博客文章] #2说: 请注意,使用Post.includes([:author,:comments])等条件,其中([‘comments.approved =?’,true])。all都会产生意想不到的后果。 #3表示那些意想不到的后果是( 注意 :示例非常相似所以我引用了博客文章的确切文本,但你必须记住解决方法,而不是具体的实现): 此查询,因为它将使用LEFT JOIN,也会丢弃所有post,而不会在其任何评论上添加带有“first”字样的评论。 也就是说,如果存在非“关联”对象,则不会加载“主关联”对象。 当我尝试通过在我之前的问题中 添加诸如.where(:category_relationships => {:user_id => @current_user.id}) 条件来尝试使用预先加载时会发生这种情况,但我不希望这种情况发生。 所以(失败者因为我可能无法在我的情况下使用急切加载,其中条件无法在has_many语句中设置 – 请注意,在上面的代码中, @current_user.id是“动态设置”,与上述网站中的示例不同) , 我想知道是否有pratiques /技术/策略以限制数据库查询,因为我有一个“N + 1问题” 。 也许这些pratiques /技术/策略可以通过使用Ruby on Rails框架来实现…… #1说: 即使Active Record允许您像加入一样指定热切加载关联的条件,但推荐的方法是使用联接。 什么以及如何以正确的方式解决这个问题? 也许解决方案是通过运行特定的和分离的数据库查询来检索和构建自己需要加载的内容,但问题是如何“检索”/“关联”/“插入”那些检索到的“关联”对象到“主要相关的“对象,以便那些可以使用”一个là急切加载“的方式? 也就是说,如何使用@article.comments类的代码(参见上述问题以获取更多信息)并获得我自己急于加载的评论? 在我急切加载之后,是否有可能 / 正确地制作类似@article.comments = […]