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に << で追加する形式も対応している。