Mongoid: Wie lade ich nur einige Felder eines Objekts, das ich faul per Referenz lade?

Aus Performancegründen benutze ich das so oft wie möglichonly() Schlüsselwort beim Schreiben einer mongoiden Abfrage, um die Felder anzugeben, die ich laden möchte.

Der übliche Verdächtige ist zum Beispiel, wenn ich die E-Mail aller meiner Administratoren eines Benutzers nur zu Anzeigezwecken haben möchte.

Ich würde schreiben:

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

Ich mache das, weil mein Benutzermodell ziemlich viele Daten enthält, die ich gerne ignorieren kann, wenn ich eine Reihe von E-Mails aufliste.

Stellen Sie sich nun jedoch vor, dass meine Benutzer über ein Projektmodell referenziert werden, sodass ich für jedes Projekt Folgendes tun kann:project.user. Dank des langsamen Ladens von mongoid wird mein Objektbenutzer nur dann instanziiert (und von der Datenbank abgefragt), wenn ich die Referenz aufrufe.

Aber was ist, wenn ich zum Beispiel alle E-Mails des Eigentümers aller Admin-Projekte auflisten möchte?

Ich würde folgendes schreiben:

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

Das Hauptproblem dabei ist, dass ich das gesamte Benutzerobjekt für jedes Projekt lade und wenn es viele Projekte gibt, die mit der Abfrage übereinstimmen, kann das ziemlich schwer werden. Wie lade ich nur die E-Mails?

Ich könnte das machen:

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

Aber dies macht offensichtlich den Zweck der netten Syntax zunichte, einfach Folgendes zu tun:

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

Ich wünschte, ich könnte etwas schreiben wie:p.user.only(:email).email, aber ich kann nicht. Irgendwelche Ideen ?

Alex

Antworten auf die Frage(2)

Ihre Antwort auf die Frage