Railsで使用しているActiveRecordについて質問です。


レコード取得の条件をリクエストパラメータの指定の有無によって動的に作成したいです。

リクエストパラメータが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

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2012/02/29 21:04:16
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答1件)

id:nuna No.1

回答回数32ベストアンサー獲得回数11

ポイント100pt

モデルのクラス名を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 辺りを参照ください。

他1件のコメントを見る
id:nuna

すみません。勘違いしてました。
allはRails2.x以前からあるAPIで(仕様として)遅延評価しないので、私の書き方だとダメですね。

ですので、試されたようにallは使わず書いてください。

2012/02/26 23:27:16
id:Gaasu

コメントありがとうございます。
allを使わない実装を考えてみます。

2012/02/29 21:04:00

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません