Will_Paginate - как получить массив всех идентификаторов разбитых на страницы объектов? - PullRequest
3 голосов
/ 17 октября 2011

Я использую will_paginate 2.3.x gem и пытаюсь получить массив всех идентификаторов объектов, которые находятся в WillPaginate :: Collection.Есть ли простой способ перебрать все элементов в коллекции?С коллекцией ActiveRecord это просто:

all_ids = MyObject.find(:all).map { |o| o.id }

Однако, когда разбито на страницы, коллекция возвращает только N элементов, которые находятся на первой странице:

not_all_ids = MyObject.paginate(:page => 1).map { |o| o.id }

То, что я хочу, это пойтичерез все страницы в коллекции.По сути, я ищу метод, который получает следующую страницу.Какие-нибудь мысли?спасибо.

РЕДАКТИРОВАТЬ - Я использую рельсы 2.3.Кроме того, я использую нумерацию страниц с некоторыми условиями, но я упустил их для упрощения:

1 Ответ

2 голосов
/ 17 октября 2011

Вы можете сделать что-то подобное:

ids = MyObject.select("id").paginate(:page => 1)
if ids.total_pages > 1
  (2..ids.total_pages).each do |page|
    ids << MyObject.select("id").paginate(:page => page)
  end
end
ids = ids.map(&:id)

Но зачем использовать пагинат в этом случае?

ids = MyObject.select("id").map(&:id)

будет быстрее и будет использовать меньше ресурсов ... если ваша база данных содержит 10000 элементов, и вы перебираете 10 раз за раз, вы получите 1000 cals к вашей базе данных: 1) -)

ps: я использую .select ("id") , поэтому сгенерированный запрос:

SELECT id from users;

VS

SELECT * FROM users;

Я также использую хороший ярлык map (&: id) , это эквивалент .map {| o | o.id}

...