Mongoid: Как загрузить только некоторые поля объекта, который вы лениво загружаете по ссылке?

Из соображений производительности я использую ключевое слово only()как можно чаще при написании монгоидного запроса, чтобы указать поля Я хочу загрузить.

Обычное подозрение возникает, например, когда мне нужна электронная почта пользователя всех моих администраторов только для отображения.

Я бы написал:

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

Я делаю это, потому что моя пользовательская модель полна большого количества данных, которые я могу с удовольствием проигнорировать при перечислении кучи электронных писем.

Однако теперь давайте представим, что на моих пользователей ссылаются через модель Project, так что для каждого проекта я могу сделать: project.user. Благодаря ленивой загрузке mongoid мой пользователь объекта будет создан (и запрошен из БД) только тогда, когда я вызову ссылку.

Но что, если я хочу, например, перечислить всю электронную почту владельца всего административного проекта?

Я бы написал так:

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

Основная проблема заключается в том, что при этом я загружаю весь пользовательский объект для каждого проекта, и если есть много проектов, соответствующих запросу, это может стать довольно тяжелым. Итак, как мне загрузить только электронные письма?

Я мог бы сделать это:

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

Но это, очевидно, противоречит цели красивого синтаксиса простого действия:

p.user.email 

Хотел бы я написать что-то вроде: p.user.only(:email).email , но я не могу.Любые идеи ?

Alex

10
задан Alex 7 May 2012 в 08:29
поделиться