Вы можете рассматривать объект критерия как массив. Искатели возвращают объект критерия, потому что критерий является связным в mongoid. То есть вы можете сделать что-то вроде:
users = User.where(:activated => true)
users = users.where(:created_at.gte => Time.now - 1.week) unless params[:recent].blank?
users = users.where(:gender => params[:gender].downcase) if %w[m f].include?(params[:gender].downcase
Каждый раз, когда вы используете какие-либо методы, которые не определены в Criteria
, mongoid фактически выполняет запрос, извлекает результаты и обрабатывает их как массив. Если вы хотите, чтобы результаты были возвращены в виде массива, вы всегда можете вызвать User.all.to_a
. Но имейте в виду, что следующие два в основном эквивалентны:
User.all.each {|u| puts u.id}
User.all.to_a.each {|u| puts u.id}
Но есть одна проблема, связанная с более поздней: она будет загружать все документы в память один раз и может привести к чрезмерному потреблению памяти. Однако первый использует курсоры Mongodb для полной загрузки и загружает только документы, полученные курсором, что означает контролируемое использование памяти.