我正在运行Ruby on Rails 3.1.我阅读了以下有关急切加载的文章和文档,我想找到一种正确的方法来做事:
在#2说:
请注意,使用Post.includes([:author,:comments])等条件.其中(['comments.approved =?',true]).all可能会产生意想不到的后果.
在#3说,这些意想不到的后果是:(注:例子是很相同的,所以我引用的博客文章中的确切文本,但你必须记住的解决办法,而不是具体实现):
此查询,因为它将使用LEFT JOIN,也会丢弃所有帖子,而不会在其任何评论上添加带有"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 = …
我有以下型号:
class Rating < ActiveRecord::Base
belongs_to :item
belongs_to :user
end
class Item < ActiveRecord::Base
has_many :ratings
end
Run Code Online (Sandbox Code Playgroud)
我想获取所有项目,以及特定用户的评级,以显示每个项目旁边的当前用户评级(如果存在!).
我试过了...
Item.includes(:ratings).where('ratings.user_id = ?', user_id)
Run Code Online (Sandbox Code Playgroud)
...但是没有给我没有评级的项目.
我的第一个想法是与参数的has_many关联,然后使用includes方法传递该参数.但这似乎并不存在.
如何在不执行N + 1查询或将所有实体加载到内存中的情况下,在参数上过滤所有帖子和预先加载的关联?