Mongoid:如何仅通过引用加载延迟加载的对象的某些字段?

Ale*_*lex 10 lazy-loading model-associations mongoid ruby-on-rails-3

出于性能原因,我only()在编写mongoid查询时尽可能多地使用关键字来指定我要加载的字段.

通常的嫌疑人,例如,当我想要所有管理员的用户电子邮件仅用于显示目的时.

我会写:

User.where(:groups => :admins).only(:email).each do |u|
 puts u.email
end
Run Code Online (Sandbox Code Playgroud)

我这样做是因为我的用户模型中充满了很多数据,在列出一堆电子邮件时我很乐意忽略这些数据.

但是,现在让我们想象一下,我的用户是通过Project模型引用的,因此对于我可以做的每个项目:project.user.由于mongoid的延迟加载,我的对象用户只有在调用引用时才会被实例化(并从数据库中查询).

但是,如果我想列出所有管理项目所有者的所有电子邮件呢?

我会写这个:

Project.where(:admin_type => true).each do |p|
  puts p.user.email
end
Run Code Online (Sandbox Code Playgroud)

这里的主要问题是,这样做,我为每个项目加载整个用户对象,如果有很多项目匹配查询可能会变得非常沉重.那么我该如何只加载电子邮件呢?

我能做到这一点:

User.where(:_id => p.user_id).only(:email).first.email
Run Code Online (Sandbox Code Playgroud)

但这显然打败了简单做法的好语法的目的:

p.user.email 
Run Code Online (Sandbox Code Playgroud)

我希望我能写出类似的东西:p.user.only(:email).email但我不能.有任何想法吗 ?

亚历克斯

Ale*_*lex 6

来自Mongoid的创建者的回答.这还不可能.它已被添加为功能请求.