Ruby on rails 钢轨预紧载荷与极限
我想我需要一个类似于rails急切加载的查询的东西,但我很难找到解决方案 为了简单起见,让我们假设系统中的Ruby on rails 钢轨预紧载荷与极限,ruby-on-rails,limit,eager-loading,Ruby On Rails,Limit,Eager Loading,我想我需要一个类似于rails急切加载的查询的东西,但我很难找到解决方案 为了简单起见,让我们假设系统中的Persons永远不会超过30个(因此Person。所有都是一个小数据集),但每个人都会有超过2000条注释(因此Person.include(:comments)将是一个大数据集) 家长会 控制器 class PersonController
Person
s永远不会超过30个(因此Person。所有都是一个小数据集),但每个人都会有超过2000条注释(因此Person.include(:comments)
将是一个大数据集)
家长会
控制器
class PersonController
不幸的是,状态为:“如果您使用指定的:limit选项加载关联,它将被忽略,并返回所有关联的对象”
有什么好办法吗?还是我注定要在急切加载1000个不需要的ActiveRecord对象和N+1查询之间做出选择?还要注意,这是一个简化的示例。在现实世界中,我将与人
有其他关联,在与评论
相同的索引
操作中。(照片、文章等)。无论“那篇文章”说了什么,问题在于SQL中,在这种情况下,您不能仅通过使用标准的限制
但是,您可以添加一个新列并执行WHERE子句
将第二个关联更改为Person has\u many:sample\u of\u comments,conditions:{is\u sample:true}
将is\u示例
列添加到comments
表中
在创建之前添加一个Comment#
hook,分配is_sample=person.sample_of_comments.count<5
不管rails或activerecord是什么,首先尝试提出一对SQL,您认为这对SQL将为您提供结果集。如果您不能,那么任何orm库都不能。@ChadM您有没有设法找到这个问题的解决方案?或者你有没有一些一般性的建议,可以给别人指出正确的方向?我也有同样的问题:我不想急于加载2000条评论:'(@BKSpurgeon,不幸的是,我们没有。结果是我们收集的人(根据上面的例子)如果不是这样的话,我们可能会在提交后执行类似于已接受答案的,或者将某种触发器直接放入数据库。嗨,Choonket,这不是一个坏主意。不幸的是,对于此人创建的每一条评论,将被视为样本的评论集都会移动一个。我想,对所有语句集进行某种更新可以做到这一点,但这似乎是一篇沉重的文章。示例:此人有5条评论,都是“样本”.Person创建第6条注释。现在,注释1不应再作为示例集的一部分,而注释2到6现在是示例注释集。
class Person < ActiveRecord::Base
has_many :comments
end
class Comment < ActiveRecord::Base
belongs_to :person
end
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