出于性能方面的原因,我经常用尽可能的only()
以指定我要加载的领域书写了mongoid查询时关键字。
普通嫌疑犯,是例如当我想我所有的管理员只为显示目的的用户的电子邮件。
我会写:
User.where(:groups => :admins).only(:email).each do |u|
puts u.email
end
我这样做是因为我的用户模型是相当充分了很多,清单一堆邮件时,我可以很高兴地忽视数据。
然而,现在我们想象,我的用户是通过一个项目模型中引用,使每个项目我可以这样做: project.user
。 由于mongoid的延迟加载,我的目标用户将只能被实例化(从DB查询),当我呼吁参考。
但是,如果我想要的东西列出,例如所有管理项目的所有者的所有电子邮件?
我会这样写:
Project.where(:admin_type => true).each do |p|
puts p.user.email
end
这里的主要问题是,这样做,我将整个用户对象为每个项目,如果有很多项目的匹配,可以得到相当沉重的查询。 那么,如何只加载邮件?
我可以这样做:
User.where(:_id => p.user_id).only(:email).first.email
但是,这显然打败简单地做的很好的语法的目的:
p.user.email
我希望我能写的东西,如: p.user.only(:email).email
,但我不能。 有任何想法吗 ?
亚历克斯