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