2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ransackでORやANDを明示的に書きたいとき

Posted at

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に合わせず自前でクエリ書く方がいい気がする。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?