例如,我有两个文件
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
但它似乎并没有改变任何东西