initializer で頑張ると、いろいろと検索条件が追加できる。
というのを、今日気づく。ひたすらソース読解。
どうしてもcontrollerは汚したくない。
全画面的に使う条件なので猶更。
かといって、JSで頑張るのはもう嫌…。
というわけで、ransack自体をチューニング。
結果はこちら。
大成功
/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の自動生成)が使えない。
→ 個別実装
※ 正規表現で日本語の記号が難しい。とりま読点と中黒で逃げる
参考までに、類似のドキュメントをいろいろと。
この情報、少なくてつらかったゎー