Mongoid: ¿Cómo cargar solo algunos campos de un objeto que se carga perezosamente por referencia?

Por razones de rendimiento, uso lo más a menudo posible elonly() palabra clave al escribir una consulta mongoid para especificar los campos que quiero cargar.

El sospechoso habitual es, por ejemplo, cuando deseo el correo electrónico de un usuario de todos mis administradores solo para fines de visualización.

Yo escribiría:

<code>User.where(:groups => :admins).only(:email).each do |u|
 puts u.email
end
</code>

Hago esto porque mi modelo de usuario está bastante lleno de una gran cantidad de datos que con mucho gusto puedo ignorar al incluir un montón de correos electrónicos.

Sin embargo, ahora imaginemos que se hace referencia a mis usuarios a través de un modelo de Proyecto, de modo que para cada proyecto puedo hacer:project.user. Gracias a la carga perezosa de mongoid, mi usuario de objeto solo recibirá una instancia (y se consultará desde la base de datos) cuando llame a la referencia.

Pero, ¿qué sucede si deseo enumerar todos los correos electrónicos del propietario de todos los proyectos de administración, por ejemplo?

Yo escribiría esto:

<code>Project.where(:admin_type => true).each do |p|
  puts p.user.email
end
</code>

El principal problema aquí es que al hacer esto, cargo el objeto de usuario completo para cada proyecto, y si hay muchos proyectos que coinciden con la consulta, podría ser bastante pesado. Entonces, ¿cómo puedo cargar sólo los correos electrónicos?

Yo podría hacer esto:

<code>User.where(:_id => p.user_id).only(:email).first.email
</code>

Pero esto obviamente anula el propósito de la buena sintaxis de simplemente hacer:

<code>p.user.email 
</code>

Ojalá pudiera escribir algo como:p.user.only(:email).email, pero no puedo Algunas ideas ?

Alex

Respuestas a la pregunta(2)

Su respuesta a la pregunta