rails ransack検索でand or 複合条件を使う

エンジニアの山本です。 今回もrailsで引っかかった話です。 railsの便利機能でransack検索という…

エンジニアの山本です。

今回もrailsで引っかかった話です。

railsの便利機能でransack検索というのがあります。
これを使うと条件検索の機能が簡単に実装できる優れものです。
ですが、このransackでand or 複合条件を使おうと思うとこれが結構厄介なのです。

たとえば、任意のテーブル”datatable”任意のにおいてカラム”start_date”が人の日付”date”以下、且つ、カラム”end_date”が”date”以上もしくはnullであるデータを検索しようとした場合、
通常のSQLであれば
select * from datatable where start_date = date or end_date is null)
のような条件式を書くと思います。

これをransack検索で書くとこんな感じになります。
@q = datatable.ransack(search_params.merge( g:{‘0′ => {start_date_lteq: search_params[:date]},’1’ => {m: ‘or’, end_date_gteq: search_params[:date], end_date_null: 1}} ))

‘0’とか’1’とか凄く分かりにくいですが、こういうもんだと思って覚えるしかないですね。