Я использую Mongoid для работы с MongoDB. Все хорошо, мне очень нравится и так далее. В моем приложении блога (контроллер сообщений, действие index) у меня есть этот код:
@posts = Post.without(:comments)
@posts = @posts.my_search(params[:s]) if params[:s]
@posts = @posts.order_by([:created_at, :desc])
@posts = @posts.where(:pid.lt => params[:p].to_i+1) if params[:p]
@posts = @posts.limit(items_per_page+1)
Часть с "где" - это реализация моего собственного метода нумерации страниц (позволяет публиковать результаты только в одном направлении, но без skip()
, что я считаю плюсом). Теперь есть несколько небольших проблем, которые заставляют меня чувствовать себя некомфортно:
Чтобы моя нумерация страниц работала, мне нужно получить последнее сообщение в пределах этого лимита. Но когда я делаю @posts.last
, я получаю последний документ всего запроса без ограничений. Хорошо, это странно, но не большая проблема. Кроме того, результаты запроса действуют почти как обычный массив, поэтому в данный момент я получаю последний элемент с @posts.pop
(забавно, но он не удаляет документы) или @posts.fetch(-1)
У меня такое ощущение, что это не "правильный путь", и что-то должно быть более элегантным. Также
@posts.count
генерирует второй запрос точно так же, как первый (без ограничений), но только с "count", и мне это не нравится.
Если я сделаю последнюю строку похожей на
@posts = @posts.limit(items_per_page+1).to_ary
для преобразования результатов запроса в массив, все генерирует только один запрос (хорошо), но теперь @posts.count
перестает сообщать о том, что мне нужно (общее количество документов без примененного ограничения) и ведет себя точно так же, как @posts.size
- возвращает items_per_page+1
или меньше (плохо).
Итак, вот мои вопросы:
1) Как «правильно» получить последний документ результатов запроса в пределах заданного лимита?
2) Как получить общее количество документов с заданными условиями без генерации дополнительного запроса?
UPD:
3) @ posts.first генерирует дополнительный запрос, как его предотвратить и просто получить первый документ, прежде чем я переберу все документы?