Mongoid: Como carregar apenas alguns campos de um objeto que você carrega preguiçosamente via referência?
Por motivo de desempenho, uso com a maior freqüência possívelonly()
palavra-chave ao escrever uma consulta mongóide para especificar os campos que eu quero carregar.
O suspeito habitual é, por exemplo, quando eu quero o e-mail de um usuário de todos os meus administradores apenas para fins de exibição.
Eu escreveria:
User.where(:groups => :admins).only(:email).each do |u|
puts u.email
end
Eu faço isso porque meu modelo de usuário é bastante cheio de muitos dados que eu posso ignorar com prazer ao listar um monte de e-mails.
Porém, agora vamos imaginar, que meus usuários sejam referenciados através de um modelo de Projeto, para que para cada projeto eu possa fazer:project.user
. Graças ao carregamento lento de mongoid, meu usuário de objeto só será instanciado (e consultado pelo DB) quando eu chamar a referência.
Mas e se eu quiser listar todos os e-mails do proprietário de todos os projetos de administração, por exemplo?
Eu escreveria isto:
Project.where(:admin_type => true).each do |p|
puts p.user.email
end
O maior problema aqui é que, ao fazer isso, carrego o objeto de usuário inteiro para cada projeto e se houver muitos projetos correspondentes à consulta que podem ficar muito pesados. Então, como eu carrego apenas os e-mails?
Eu poderia fazer isso:
User.where(:_id => p.user_id).only(:email).first.email
Mas isso obviamente derrota o propósito da bela sintaxe de simplesmente fazer:
p.user.email
Eu gostaria de poder escrever algo como:p.user.only(:email).email
mas não posso. Alguma ideia ?
Alex