Я использую Mongoid для работы с MongoDB. Все отлично, мне очень нравится и тд. В моем приложении для блога (контроллер сообщений, действие индекса) у меня есть этот код:
@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
генерирует второй запрос точно так же, как и первый (без ограничений), но только с «количеством», и мне это не нравится.
Если я сделаю последнюю строку похожей на
@posts = @posts.limit(items_per_page+1).to_ary
чтобы преобразовать результаты запроса в массив, все генерирует только один запрос (хорошо), но теперь @posts.count
перестает сообщать то, что мне нужно (общее количество документов без примененного ограничения) и ведет себя точно так же, как @posts.size
- возвращает items_per_page+1
или меньше (плохо).
Итак, вот мои вопросы:
1) Каков "правильный" способ получить последний документ результатов запроса в пределах заданного лимита?
2) Как получить общее количество документов с заданными условиями без создания дополнительного запроса?
УПД:
3) @posts.first генерирует дополнительный запрос, как его предотвратить и просто получить первый документ, прежде чем я переберу все документы?