Mongoid: Jak załadować tylko niektóre pola obiektu, którego leniwe ładowanie jest referencyjne?

Ze względu na wydajność używam tak często, jak to możliweonly() słowo kluczowe podczas pisania zapytania mongoid w celu określenia pól, które chcę załadować.

Zwykłym podejrzanym jest na przykład, gdy chcę e-mail użytkownika wszystkich moich administratorów tylko do celów wyświetlania.

Napisałbym:

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

Robię to, ponieważ mój model użytkownika jest pełen wielu danych, które z przyjemnością mogę zignorować, gdy wypisuję kilka e-maili.

Jednak teraz wyobraźmy sobie, że do moich użytkowników odwołuje się model projektu, więc dla każdego projektu mogę to zrobić:project.user. Dzięki leniwemu ładowaniu mongoid, mój użytkownik obiektu otrzyma instancję (i zapyta z bazy danych), gdy wywołam odwołanie.

Ale co, jeśli chcę na przykład wyświetlić listę wszystkich wiadomości e-mail właściciela całego projektu administracyjnego?

Napisałbym to:

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

Głównym problemem jest to, że robię to, ładuję cały obiekt użytkownika dla każdego projektu i jeśli jest wiele projektów pasujących do zapytania, które może być dość ciężkie. Jak więc załadować tylko e-maile?

Mogę to zrobić:

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

Ale to oczywiście pokonuje cel ładnej składni po prostu robiąc:

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

Chciałbym móc napisać coś takiego:p.user.only(:email).email, ale nie mogę. Jakieś pomysły ?

Alex

questionAnswers(2)

yourAnswerToTheQuestion