Railsプラグイン ez_where がクソ便利

Railsの検索画面などを作るときに、入力パラメータに合わせて conditionsを変更したい場合等が多数あると思うけどそういう場合は ez_whereがめちゃ便利

インストール

./script/plugin install http://opensvn.csie.org/ezra/rails/plugins/dev/ez_where/

Userテーブルのemailかnameかcategoryのどれかが入力されていて、入力されている値でconditionsを生成したいという場合は以下の通り

  options = {:limit => 300}
  @users = User.ez_find(:all, options) do |where|
    where.email == params[:email] unless params[:email].blank?
    where.name  =~ "%#{params[:name]}%" unless params[:name].blank?
    where.category == params[:category] unless params[:category].blank?
  end

演算子によって where句がうまく生成される。ちなみに演算子とwhereの対応は

foo == 'bar' ["foo = ?", 'bar']
foo =~ '%bar' ["foo LIKE ?", '%bar']
foo <=> (1..5) ["foo BETWEEN ? AND ?", 1, 5]
foo === [1, 2, 3, 5, 8] ["foo IN(?)", [1, 2, 3, 5, 8]]
foo > 1 ["foo > ?", 1]

という感じになる。またwill_paginateなどで使用したい場合は

  cond = Caboose::EZ::Condition.new
  cond << ["email = ?", params[:email]] unless params[:email].blank?
  cond << ["name like ?", "%#{params[:name]}%"] unless params[:name].blank?
  cond << ["category = ?", params[:category]] unless params[:category].blank?
  @users = User.paginate(:page => params[:page], :per_page => 30,
                         :conditions => cond.to_sql)

と conditionsに << で追加する形式も対応している。