2

例如,我有两个文件

class Task
  include Mongoid::Document

  field :name, type: String
  belongs_to :person
end

class Person
  include Mongoid::Document

  field :name, type: String
  has_one :stage
end

我的控制器中有一个方法

def index
  tasks = Task.all
  render :json => tasks.to_json(:include => :person)
end

查看生成的查询,我看到它为每个任务查找人员(目前有 3 个任务)

MOPED: 127.0.0.1:27017 QUERY        database=pipeline_development collection=tasks selector={} flags=[:slave_ok] limit=0 skip=0 fields=nil (0.3619ms)
MOPED: 127.0.0.1:27017 QUERY        database=pipeline_development collection=people selector={"$query"=>{"_id"=>"50f12eb2cce8b43b05000001"}, "$orderby"=>{:_id=>1}} flags=[:slave_ok] limit=-1 skip=0 fields=nil (0.1998ms)
MOPED: 127.0.0.1:27017 QUERY        database=pipeline_development collection=people selector={"$query"=>{"_id"=>"50f12eb2cce8b43b05000001"}, "$orderby"=>{:_id=>1}} flags=[:slave_ok] limit=-1 skip=0 fields=nil (0.3881ms)
MOPED: 127.0.0.1:27017 QUERY        database=pipeline_development collection=people selector={"$query"=>{"_id"=>"50f12eb2cce8b43b05000001"}, "$orderby"=>{:_id=>1}} flags=[:slave_ok] limit=-1 skip=0 fields=nil (0.2272ms)

这实际上可以加起来(在我的数据库中每次查找的时间实际上是 25 毫秒而不是 0.3 毫秒)并导致不合理的缓慢。

对于如何解决这个问题,有任何的建议吗?

编辑

我尝试急切加载

def index
  tasks = Task.all.includes(:person)
  render :json => tasks.to_json(:include => :person)
end

但它似乎并没有改变任何东西

4

0 回答 0