will_paginateで配列からページネーションする
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をやはり継承していました。