使用include属性可以很好地加载
Post.find(:all, :include => :author)
Run Code Online (Sandbox Code Playgroud)
我想知道你是否也可以急于加载计数,比如我想获得每个帖子的评论数量,而不加载所有评论本身?
也许是这样的
Post.find(:all, :include => [:author, "count(comments)")
Run Code Online (Sandbox Code Playgroud)
我想我可以使用count_cache列.但如果有可能的话,在一个包含中做这一切真的很美.
额外的奖励积分,如果有人可以展示如何不仅得到计数,但也提出一些条件,例如只有已经批准的帖子的数量.
这与一年前的一个问题有关.
我提出了一个开箱即用的问题示例,只要你有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
Run Code Online (Sandbox Code Playgroud)
我在存储库中有更全面的文章,但我的一般问题是这个.
如何以最小化数据库查询的方式使Rails急切加载计数?
尽管在ActiveRelation 中包含了该关联,但n+1只要您#count在关联上使用该问题就会出现问题#includes(:associated).一种解决方法是使用#length,但只有当它被调用的对象已被加载时才能正常工作,更不用说我怀疑它复制了Rails内部已经完成的东西.此外,使用的一个问题#length是,当开始时没有加载关联时,它会导致不幸的过载,并且只需要计数.
从自述文件:
我们可以通过在posts数组上运行#length来解决这个问题(参见附录),这已经加载了,但是也可以随时使用.它不仅更加一致; 它提供了一个访问路径,不一定需要加载帖子.例如,如果你有一个部分显示计数,无论什么,但一半的时间,部分是在加载帖子和一半时间没有调用,你面临以下情况:
- 运用
#count
- n
COUNT已经加载帖子时的样式查询- n
COUNT尚未加载帖子时的样式查询- 运用
#length
- 在已加载帖子时将其他查询归零
- n
*尚未加载帖子时的样式查询在这两种选择之间,没有主导选择.但是修改#count来推迟#length或访问存储在幕后的其他方式的长度会很好,这样我们就可以得到以下场景:
- 使用修改
#count
- 在已加载帖子时将其他查询归零
- n
COUNT尚未加载帖子时的样式查询
那么这里的正确方法是什么?有没有我忽略的东西(非常非常可能)?