読者です 読者をやめる 読者になる 読者になる

will_paginateで配列からページネーションする

Rails Ruby

will_paginateの一般的な使い方は

@users = User.paginate(:page => params[:page], :per_page => 20)

こんな使い方だと思うんですが、最近will_paginateは
Arrayを拡張しているのに気づきました。(遅い!)
私はよく、sessionにオブジェクトのIDの配列を持つ場合があります。
これだとpaginateオブジェクトを上のようにクラスメソッドで
作成できないのですが、以下のように簡単にできます。

>> session[:user_ids]
=> [22, 15, 2, 19]

このようなデータがあったときに

users=User.find(session[:user_ids]).paginate(:page => params[:page], :per_page => 20)

でpaginateオブジェクトを作成できます。
つまり、Array#paginateとやるだけです。

>> users.class
=> WillPaginate::Collection

paginateオブジェクトが返っています。
inspectの結果がArrayっぽいのでどうなんだろ?と思ったら、

>> users.class.ancestors
=> [WillPaginate::Collection, Array, ActiveSupport::CoreExtensions::Array::RandomAccess, ActiveSupport::CoreExtensions::Array::Grouping, ActiveSupport::CoreExtensions::Array::ExtractOptions, ActiveSupport::CoreExtensions::Array::Conversions, ActiveSupport::CoreExtensions::Array::Access, Enumerable, Object, InstanceExecMethods, Base64::Deprecated, Base64, Kernel]

となっていて、Arrayをやはり継承していました。