Will_Paginate - 如何获取所有分页对象id的数组?

时间:2011-10-17 10:51:47

标签: ruby-on-rails collections will-paginate traversal

我正在使用will_paginate 2.3.x gem,我正在尝试获取WillPaginate :: Collection中所有对象的ID数组。是否有一种简单的方法可以迭代所有集合中的项目?使用ActiveRecord集合,这很简单:

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

但是,在分页时,集合仅返回第一页中的N个元素:

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

我想要的是浏览集合中的所有页面。基本上,我正在寻找一种方法来检索下一页。有什么想法吗?感谢。



编辑 - 我正在使用rails 2.3。此外,我正在使用某些条件进行分页,但将其删除以简化:

MyObject.paginate(:conditions => [...], :include => [...], :page => 1)

1 个答案:

答案 0 :(得分:2)

你可以这样做:

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)

但为什么在这种情况下使用paginate?

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

会更快,并且将使用更少的资源...如果你的数据库包含10000个元素,并且你有时会迭代10次,那么你将为你的数据库制作1000个cals vs 1: - )

ps:我正在使用 .select(“id”),因此生成的请求是:

SELECT id from users;

VS

SELECT * FROM users;

我也使用了一个很好的快捷方式 map(&amp;:id),这相当于 .map {| o | o.id}