gpt4 book ai didi

ruby-on-rails - 你如何做有限制的急切加载?

转载 作者:行者123 更新时间:2023-12-03 15:29:34 25 4
gpt4 key购买 nike

在预先加载的文档中指出:

如果使用指定的 :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 } )

最佳答案

我相信这是因为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

那样 .comments在您需要时就在那里,您也可以像这样缩小范围:
@picture.comments.recent

关于ruby-on-rails - 你如何做有限制的急切加载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6477614/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com