2
2

More than 3 years have passed since last update.

ransack で一番スマートに AND/OR検索

Last updated at Posted at 2018-06-05

initializer で頑張ると、いろいろと検索条件が追加できる。
 というのを、今日気づく。ひたすらソース読解。

どうしてもcontrollerは汚したくない。
全画面的に使う条件なので猶更。
かといって、JSで頑張るのはもう嫌…。
というわけで、ransack自体をチューニング。

結果はこちら。
大成功 :rainbow:

/config/initializers/ransack.rb
Ransack.configure do |config|
  # tokenize検索 (AND/OR)
  config.add_predicate 'contains_all',
         arel_predicate: 'matches_all',
         formatter: ->(v){ v.split(/[\p{blank}\p{cntrl}\p{punct}\s、・]+/).compact.map {|s| "%#{Ransack::Constants.escape_wildcards(s)}%" } },
         type: :string,
         compounds: false
  config.add_predicate 'contains_any',
         arel_predicate: 'matches_any',
         formatter: ->(v){ v.split(/[\p{blank}\p{cntrl}\p{punct}\s、・]+/).compact.map {|s| "%#{Ransack::Constants.escape_wildcards(s)}%" } },
         type: :string,
         compounds: false
end

 

※ arel_predicateにmatchesではなく contを使いたかった
 しかし、contは使用不可(matchesの拡張)
 → contの実装を解読してformatterを展開する方針で。
 /ransack/adapters/active_record/ransack/constants.rb
※ stringを配列化している関係で、compounds(=any,allの自動生成)が使えない。
 → 個別実装
※ 正規表現で日本語の記号が難しい。とりま読点と中黒で逃げる

参考までに、類似のドキュメントをいろいろと。
この情報、少なくてつらかったゎー

参考

公式Wiki
公式 サンプル
Ransackで日付検索
Ransackで年齢検索
RansackでNull許容検索

正規表現
正規表現 全角記号 こちらはrubyでは難しいみたい

2
2
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
2