利用例
userがaddressとnameを持っていて、「博多 田中」で検索したら「博多の田中さん」に該当するグループを出力したい場合。
実装方法
ransackを使います
Gemfile
gem 'ransack'
app/views/users/index.html.erb
<%= search_form_for @q, url: users_path do |f| %>
<%= f.text_field :search_words %>
<%= f.submit 'Search' %>
<% end %>
app/controllers/users_controller.rb
def index
words = params[:q].delete(:search_words) if params[:q].present?
if words.present?
params[:q][:groupings] = []
words.split(/[ ]/).each_with_index do |word, i| #全角空白と半角空白で切って、単語ごとに処理します
params[:q][:groupings][i] = { name_or_address_cont: word }
end
end
@q = User.ransack(params[:q])
@users = @q.result(distinct: true)
end
注意点
groupingsというキーに入れることが重要です。
名前が違うと期待通り動作しません。
以上、誰かのお役に立てれば幸いです。
参考
multiple word column ransack searchなどで検索しました。
https://github.com/activerecord-hackery/ransack/issues/85
https://github.com/activerecord-hackery/ransack