Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 钢轨预紧载荷与极限_Ruby On Rails_Limit_Eager Loading - Fatal编程技术网

Ruby on 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

我想我需要一个类似于rails急切加载的查询的东西,但我很难找到解决方案

为了简单起见,让我们假设系统中的
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