Из соображений производительности я использую ключевое слово 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