2011-10-17 50 views
3

我正在使用will_paginate2.3.x寶石,我試圖得到所有在WillPaginate :: Collection對象的ID的數組。有沒有簡單的方法來迭代所有集合中的項目?隨着ActiveRecord的集合,這是簡單的:Will_Paginate - 如何獲取所有分頁對象ID的數組?

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

然而,分頁時,該集合返回只在第一頁的N個元素:

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

我想是要經過所有頁面在集合中。基本上,我正在尋找一種檢索下一頁的方法。有什麼想法嗎?謝謝。



編輯 - 我使用軌道2.3。另外,我使用了一些條件分頁但中途他們簡化:

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

回答

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) 

但是,爲什麼在這種情況下使用分頁?

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

會更快,並使用更少的資源......如果你是數據庫包含10000元,你就迭代10在時候,你會做1000個CALS到你的數據庫對1個:-)

PS:我使用。選擇( 「ID」)如此產生的要求是:

SELECT id from users; 

VS

SELECT * FROM users; 

我也在使用一個漂亮的快捷方式map(&:id),這相當於.map {| o | o.id}

+0

我應該注意到,我在每個分頁呼叫中使用了一些條件,因此每個頁面觸及數據庫(並且有很多)會非常低效。我也忘了提及我仍然使用Rails 2.3,所以'Something.select('id')'是'Something.all(:select =>'id')'對我來說。 – sa125