Ez_Where_Twoを使ったPaginationの条件保持

ただの一覧表示におけるPaginationはPaginateでもいける。
固定のSQLの場合は何かしらの方法でキーと値を入れればいい。
では動的条件のときはどうか。
固定のSQLのときと基本は変わらないのだと思うけど、今やっているのは
Ez_Where_TwoプラグインでARに引き渡すconditionsを生成している。
これにあった形式をどう作ればいいのかで結構引っかかっていた。
結論としては
Condition.rbを見ていると<<というメソッドで一旦外だしした条件節データを
Conditionオブジェクトとして戻せるようなのでここにどう引き渡すかという
ところになった。to_sだと戻せなかったのでto_aにして対応した。
これは完全にI/FがEz_Whereの作法にのっとった形なのでそれほど使い道は
ないかもしれないけど、条件を何らかの形で持たせて画面間でやりとり
する部分は多少応用がきくかもしれない。

シチュエーション:
"item"の検索における10件ごとのページネーションを考える。itemは検索項目が
まあまああるが、基本はAND検索になる。一部日時項目があるのでそこは
範囲指定をさせている。
検索条件について。:
最初の検索フォーム以降の条件はGETで受け渡す。まあ検索条件をhidden渡し
とかセッション渡しすることはあんまりないだろうけど…
単純に引渡しをしようとすると前画面のゴミとしてparamsに"item_search",
"commit","item"などの要素が混ざってしまう。画面遷移のリンク作成
時にそのあたりを除去しておく。

Controllerの検索部

  def search_result
    condition = ""
    @q = ""
    if(params[:q] == "" || params[:q].nil?)
      condition = makeSql(params)
      @q = condition.to_a
    else
      condbase = params[:q].split(/\//)
      cond = Condition.new
      cond.<<(condbase)
      condition = cond.to_sql
      @q = params[:q]
    end
    count = Item.count(:all, :conditions => condition)
    @item_pages = Paginator.new(self, count, 10, params[:page])
    @items = Item.find(:all, :conditions => condition, :order => "updated_at DESC", :offset => @item_pages.current.offset, :limit => 10)
    if count == 0
      flash[:notice] = '条件に該当するデータがありません。'
    end

検索結果画面のリンク作成部

<% params.delete(:item_search) %>
<% params.delete(:commit) %>
<% params.delete(:item) %>
<%= @item_pages.item_count %>件中
<%= @item_pages.current.first_item %> - <%= @item_pages.current.last_item %>件目
<%= link_to '前へ', { :params => params.merge(:page => @item_pages.current.previous, :q => @q.to_a)} if @item_pages.current.previous %>
<%= pagination_links(@item_pages, :window_size => 2) %>
<%= link_to '次へ', { :params => params.merge(:page => @item_pages.current.next, :q => @q.to_a)} if @item_pages.current.next %> 

受け渡しのキーをqにしたのはgoogleっぽいイメージで。というのもあるけど
極力短いキーにしないとURLの長さが気になってしまうためでもある。
リンク作成はくまくまー本にGoogle互換という形で紹介があるのを大体
引用しています。
ちなみにURLの最大長について。
HTTPでは規定はなく、255バイトを推奨している。
HTML4.01では65536文字としている。この文字という表現が微妙だけど
まずは文字=バイトと読み替えればいいかと思う。
ブラウザ側の制限。
FireFoxはちょっと調べてないけどIEは2083バイトらしい。
Googleで長大な検索文字列を適当にいれまくったけど、それで大体
1900バイト。まあ一応なんとかなる範囲かなと。
ControllerからViewにto_aして渡しているのはEz_Where_Twoに食べさせる際
に配列の形式でないと復元出来なかったため。そのせいでURLを見ると2,3個
の条件追加で結構汚いものになってしまっている。プラグインを変えるなりすれば
変わると思うけど…
とりあえずメモ。