【发布时间】:2012-03-21 16:20:38
【问题描述】:
我认为我需要类似于 rails 急切加载的查询的东西,但我无法找到解决方案。
为了简单起见,假设系统中永远不会有超过 30 个Persons(所以Person.all 是一个小数据集)但每个人将有超过 2000 个 cmets(所以 @987654324 @ 将是一个大型数据集)。
家长协会
class Person < ActiveRecord::Base
has_many :comments
end
儿童协会
class Comment < ActiveRecord::Base
belongs_to :person
end
我需要查询Persons 的列表并包含他们的comments,但我只需要其中的 5 个。
我想做这样的事情:
有限的父关联
class Person < ActiveRecord::Base
has_many :comments
has_many :sample_of_comments, \
:class_name => 'Comment', :limit => 5
end
控制器
class PersonController < ApplicationController
def index
@persons = Person.include(:sample_of_comments)
end
end
不幸的是,this article 声明:“如果您使用指定的 :limit 选项急切加载关联,它将被忽略,并返回所有关联的对象”
有什么好的办法吗?还是我注定要在急切加载 1000 个不需要的 ActiveRecord 对象和 N+1 查询之间做出选择?另请注意,这是一个简化的示例。在现实世界中,我将与Person 有其他关联,在与comments 相同的问题的相同index 操作中。 (照片、文章等)。
【问题讨论】:
-
不管是 rails 还是 activerecord,首先尝试提出您认为可以为您提供结果集的 SQL 对。如果你不能,那么任何 orm 库也不能。
-
@ChadM 你有没有设法解决这个问题?还是您有一些一般性建议可以为某人指明正确的方向?我也有同样的问题:我不想急切加载 2000 cmets :'(
-
@BKSpureon 不幸的是,我们没有。事实证明,我们的 Persons 集合(根据上面的示例)每页将足够小,以至于 N+1 查询是两个弊端中较小的一个。如果不是这样,我们可能会做一个类似于接受的答案的
after_commit,或者将某种触发器直接放入数据库中做同样的事情。
标签: ruby-on-rails limit eager-loading