Pet*_*xey 13 optimization activerecord ruby-on-rails eager-loading
在热切加载的文档中,声明:
如果您急切地使用指定的:limit选项加载关联,它将被忽略,返回所有关联的对象:
class Picture < ActiveRecord::Base
has_many :most_recent_comments, :class_name => 'Comment',
:order => 'id DESC', :limit => 10
end
Run Code Online (Sandbox Code Playgroud)
Picture.find(:first,:include =>:most_recent_comments).most_recent_comments#=>返回所有相关注释.
如果是这种情况,那么实现加载"限制"的最佳方法是什么?
假设我们急切地将最近10篇博客帖子加载到博客的首页上,我们显然不希望它们都是如此,那么是否应该指定帖子集合的限制和排序?
除此之外,可以在深度加载的元素上指定相同的条件 - 例如,仅在每篇博客文章中显示前三个评论吗?
Blog.find(:blog_id, :include => {:posts => :comments } )
Run Code Online (Sandbox Code Playgroud)
小智 6
我相信这是因为LIMIT
sql中的命令无法很好地转换为您要执行的操作.LIMIT
将限制查询返回的总行数.你不是试图这样做.您试图限制为返回的每张图片加入的行数.为了实现这种影响,您必须使用一些复杂的SQL,如果您的表很大,可能很难优化.那时我会考虑为什么你试图限制急切加载的行.
如果急切加载的最大注释数量是可管理的(<2000左右),您可能不必担心限制SQL端.
如果你只加载10个帖子,我会考虑不要急于加载.我不希望额外的10个查询减慢速度,并且他们添加的时间,您可以通过尝试其他优化技术(如缓存)来弥补.
您应该让范围为您执行脏工作,而不是关联.这提高了可重用性,可维护性和可读性.例:
Class Picture < ActiveRecord::Base
has_many :comments, :order => 'id DESC' do
def recent
limit(10)
end
end
end
Run Code Online (Sandbox Code Playgroud)
那种方式.comments
就在您需要的时候,您也可以将其范围缩小到这样:
@picture.comments.recent
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2464 次 |
最近记录: |