ransackとは?
検索用のgem。そのテーブルや関連するテーブルのカラムでの検索をお手軽に実装できる。
https://github.com/activerecord-hackery/ransack
ただ、複雑な検索条件やカラム以外の条件で絞り込みたい場合は少し工夫が必要。
今回やりたいこと
ある要素たちについては AND
で、残りの要素たちについては OR
で検索したい。
クエリは以下のようになる。
SELECT DISTINCT sample_models.*
FROM sample_model
WHERE (sample_models.column_1 = '202001' AND sample_models.column_2 = '松村北斗')
AND ( sample_models.column_3 = 'ジェシー ' OR sample_models.column_4 = '田中樹' )
ORDER BY sample_models.id ASC
解決策:検索条件のhashを生成する
group = {
"0" => {
m: "and",
column_1: "202001",
column_2: "松村北斗"
},
"1" => {
m: "or",
column_3: "ジェシー",
column_4: "田中樹"
}
}
# 結果
SampleModel.search(g: group).result
groupに代入したhashを工夫することで、グルーピングやAND、ORの条件を自分の好きなように操ることができる。
便利!ただ、可読性が下がったりこういったイレギュラーなことをする場合は勉強するコストがかかるので、初めからransackから外れた検索条件もりもりになることが分かっている場合は無理にransackに合わせず自前でクエリ書く方がいい気がする。