Gemのpaginator

http://rubyforge.org/projects/paginator/
いわゆる,Railsで有名なPaginationのそれとは多分関係がないと思われるが定かではない,Gemのpaginatorのコトを前々から書こうと思っていて,それでいて面倒くさくて書いていなかったけれど,今日は本気でネタが無いのでこれにします.

使い方がわからん

RDocを見ても,なんだかはっきりとしない.

new(count, per_page, &select)

Instantiate a new Paginator object

Provide:

  • A total count of the number of objects to paginate
  • The number of objects in each page
  • A block that returns the array of items
    • The block is passed the item offset (and the number of items to show per page, for convenience)

あぁ,英語力が無いだけですかね.で,今回初めて思いついたテクニックとして,「どうしてもわからんかったらTestを読め」.gemのディレクトリの下,gem/#{アプリ名_バージョン}/test/#{ここ}.で,大体使い方は感じた.
irbでやってみると,こう.

>> require 'paginator'
>> arr = (1..40).to_a
>> paginator = Paginator.new(arr.size, 10) do |offset, par_page|
>>     arr[offset, par_page]
1>   end
>> puts paginator.first
#<Paginator::Page:0x4d04c4>
>> pp paginator.first.items
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>> paginator.each do |page|
>>     pp page.items
1>   end
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
[21, 22, 23, 24, 25, 26, 27, 28, 29, 30]
[31, 32, 33, 34, 35, 36, 37, 38, 39, 40]

何がしたいんだ

とりあえず1つのページが配列で構成されるっていうことは,良くわかった.でもこれ,配列のpaginate以外に,何をどうすれば有意義にpaginateできるんだろうか.ボクの固い頭では,結局配列しか思いつかないよ.

渡すブロック

Patinatorのコンストラクタに渡す引数は,全アイテム数,1ページのアイテム数,そいでからどうやってその1ページを構成するかって言う取り決めを決めるためのブロックがあるけれど,この最後に渡すブロックがイマイチピンと来ない.
例えばActiveRecordのfindとかで持ってきた配列をpaginateしたいときは,結局上みたいなブロックになるんじゃないのかなー.1ベージ毎に区切る部分,

def page(number)
  Page.new(self, number, lambda{ @select.call((number - 1) * @per_page, @per_page) })
end

これが考えるのを制限してるよ.結局,ブロックに渡さなければならない引数は2個なんだよね.


Railsのpaginationだけで良いと思う.