您如何热切限制加载?

| 在急切加载的文档中指出: 如果您渴望使用指定的:limit选项加载关联,则它将被忽略,并返回所有关联的对象:
class Picture < ActiveRecord::Base
  has_many :most_recent_comments, :class_name => \'Comment\', 
                                  :order => \'id DESC\', :limit => 10
end
Picture.find(:first,:include =>:most_recent_comments).most_recent_comments#=>返回所有关联的注释。 如果是这种情况,那么达到加载限制的最佳方法是什么? 假设我们渴望将最后10个博客帖子加载到博客的首页上,我们显然不希望全部都这样,那么应该指定帖子集合的限制和顺序吗? 除此之外,是否可以在深度加载的元素上指定相同的条件-例如,仅在每个博客文章上显示前三个评论?
Blog.find(:blog_id, :include => {:posts => :comments } )
    
已邀请:
        我相信这是因为sql中的
LIMIT
命令不能很好地转换为您要执行的操作。
LIMIT
将限制查询返回的总行数。您虽然没有尝试这样做。您试图限制返回的每张图片的连接行数。为了获得这种效果,您必须使用一些复杂的SQL,如果表很大,则可能很难对其进行优化。到那时,我会考虑为什么您要限制渴望加载的行。 如果渴望加载的注释的最大数量是可管理的(<2000左右),则您可能不必担心在SQL端进行限制。 如果您只加载10个帖子,那么我将考虑根本不希望加载。我不希望额外的10个查询会大大降低速度,而它们添加的时间是可以尝试其他优化技术(例如缓存)来弥补的。 您应该让示波器为您完成肮脏的工作,而不是关联。这提高了可重用性,可维护性和可读性。例:
Class Picture < ActiveRecord::Base
  has_many :comments, :order => \'id DESC\' do
    def recent
      limit(10)
    end
  end
end
这样一来,当您需要
.comments
时,就可以像这样将其范围缩小:
@picture.comments.recent
    
        我已经使用will_paginate来帮助我解决紧急加载(
using includes
)的问题,因为我必须一次加载许多关联的模型而无需使用
limit
Image.includes(:user,:tags).where(\"user_id !=?\",current_user.id).paginate(:page => params[:page], :per_page => 15)
或(无will_paginate(使用
limit
Image.includes(:user,:tags).where(\"user_id !=?\",current_user.id).limit(30).order(\"created_at ASC\")
...尝试一下。希望有帮助。     
        您可以使用以下构造:
Picture.find(:first, :include => :most_recent_comments).most_recent_comments.limit(10)
在AR指南中查看更多     

要回复问题请先登录注册