2008年10月21日火曜日

[Ruby on Rails] ActiveRecord以外でwill_paginateを使う方法

will_paginateはページングを行うための便利なライブラリです。
普通ActiveRecordと連携して使用することが多いと思うのですが、ActiveRecordと無関係に、普通の配列にも使えるようです。

APIを通じてデータを取得する場合などに使えそうです。

How to use will_paginate with non-ActiveRecord collection/array
(http://www.sharingb.com)


1. コレクションを取得する

ActiveRecordの場合

@posts = Post.paginate(:page => params[:page], :per_page => 10)

(@postsはWillPaginate::Collectionクラスのインスタンスになります)

非ActiveRecordの場合
@posts = Post.perform_search_and_obtain_collection(params[:criteria])

(@postsはデータの中味とデータの総数を参照できるオブジェクトを想定)


2. WillPaginate::Collection クラスのインスタンスを作成する

ここがポイントです。
非ActiveRecordの場合、WillPaginate::Collectionクラスのインスタンスを作成する必要があります。
@page_results = WillPaginate::Collection.create(params[:page], 10, @posts.total_results) do |pager|
pager.replace(@posts.items.to_array)
end

引数には現在のページ、ページごとのデータ数、データの総数を渡します。

データ(@posts.items)が配列の場合はこのように書くこともできます。
@page_results = @posts.items.paginate({
:page => params[:page],
:per_page => 10,
:total_entries => @posts.total_results
})


3: View

WillPaginate::Collectionクラスのインスタンスを作成したら、あとはActiveRecordと連携した場合と一緒です。
<ol>
<% for post in @page_results -%>
<li>Render `results` in some nice way.</li>
<% end -%>
</ol>

<p>Now let's render us some pagination!</p>
<%= will_paginate @page_results %>

0 件のコメント: