読者です 読者をやめる 読者になる 読者になる

ransackのsearch条件を複数個使いたい

プログラミング Rails

railsActiveRecordメソッドの中でも,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との組み合わせて使うしかないようですね.