railsのActiveRecordのメソッドの中でも,whereはかなり頻繁に使うし,使い勝手がいい.
ただ,これをさらに複雑な条件で絞り込みたいときなどに使うのが,ransackというGemである.
https://github.com/activerecord-hackery/ransack
使いどころも多いので,俺はよく導入しています.
基本的な使い方は
http://qiita.com/nysalor/items/9a95d91f2b97a08b96b0
ここが参考になりますね.
このransackで,複数のsearch条件が使いたいときがある.
複数条件の組み合わせというのはあるのだけれど,それは複数カラムに対してandやorで条件をつけられるとか,複数の値にマッチするとか,そういった複数条件なのである.
そうではなくて,これらを組み合わせたいときがある.
例えば,Itemモデルの,nameカラムが「"hoge"」or「"hige"」である,OR commentカラムが「"ほげ"」or「"ひげ"」であるレコードを取得したいとする.
一つ目の条件をransackで書くと
Item.search(:name_cont_any => ["hoge","hige"]).result
二つ目が
Item.search(:comment_cont_any => ["ほげ","ひげ"]).result
となる.
これら二つの条件をorでつなぎたいとき……
ORで複数条件をつなぎたいときは,一つのsearch条件で,カンマつなぎにしておけばよい
Item.search(:name_cont_any => ["hoge","hige"], :comment_cont_any => ["ほげ","ひげ"]).result
でor条件となる.
じゃぁANDは?
これが難しくて,今のところ俺は知りません.
結局andに該当させるときは,条件を削って,最終的にはsearch文の後ろにwhereをくっつけたりしている.
蛇足.
Ransackついでに,ransackはどうやらbetweenには対応しないようで,例えばwhereだと
Item.where(created_at: Date.yesterday...Date.today)
とすることで,Datetime型をbetweenで挟んだSQLを生成してくれる.
しかし,同じことをRansackでやろうとしても,Datetime型のSQL発行に対応していないらしく,betweenとして出力されない.
この辺はまだwhereとの組み合わせて使うしかないようですね.