レコード取得の条件をリクエストパラメータの指定の有無によって動的に作成したいです。
リクエストパラメータが2つあり、それを仮にparams[:a]とparams[:b]とします。
(1)両方が指定されている場合
where hoge = params[:a] and fuga = params[:b]
(2):aのみが指定されている場合
where hoge = params[:a]
(3):bのみが指定されている場合
where fuga = params[:b]
上記のように動的に条件を組み立てる実装方法を教えてください。
Rails:3.0.5
ActiveRecord:3.0.5
モデルのクラス名をItemとします。
また、とりあえず簡便のためaもbも指定しなかった場合はすべて返すとします。
実際には、必要に応じてパラメタのチェックなどしてください。
items = Item.all
if params[:a].present
items = items.where(hoge => params[:a])
end
if params[:b].present
items = items.where(fuga => params[:b])
end
Rails3のActiveRecordでは条件を追加しながらSQLを組み立てていくことができます。
上のコードではパラメタa b両方があった場合には、
items = Item.all
items = items.where(hoge => params[:a])
items = items.where(fuga => params[:b])
となり、これは以下と同じです。
items = Item.where(hoge => params[:a]).where(fuga => params[:b])
一度に条件を指定する場合は、
items = Item.where(hoge => params[:a], fuga => params[:b])
のようにも書けます。
http://gihyo.jp/dev/serial/01/ruby/0043 辺りを参照ください。
すみません。勘違いしてました。
2012/02/26 23:27:16allはRails2.x以前からあるAPIで(仕様として)遅延評価しないので、私の書き方だとダメですね。
ですので、試されたようにallは使わず書いてください。
コメントありがとうございます。
2012/02/29 21:04:00allを使わない実装を考えてみます。