Ransack搜索,如何通过拆分输入搜索参数来搜索每个单词

我目前正在尝试使用ransack gem在Rails中对模型进行搜索。 目前我正在使用基本设置。

控制器:

 def index @q = Person.search(params[:q]) @people = @q.result(:distinct => true) end 

视图:

      

我已经设法找到很多关于在多个字段上进行搜索的信息,但是,我没有设法找到任何东西来帮助我拆分:q参数,从而使我能够搜索每个(未知数量)搜索字符串中的单词以搜索的forms输入search for ??? AND ??? AND ??? ... search for ??? AND ??? AND ??? ... search for ??? AND ??? AND ??? ... ,而不是在一个部分中搜索整个字符串

有人能指出我正确的方向吗?

花了一大部分时间研究这个没有结果,我选择了一个非常好的自定义非搜索选项。

View.html.erb

 <%= form_tag siteindex_search_allproducts_path, :method => 'get' do %> Search:  <%= text_field_tag :search, params[:search] %> <%= submit_tag "Search", :name => nil %> <% end %> 

Controller

 @findproducts = Allproduct.order('price ASC').search(params[:search]) 

model.rb

 def self.search(*args) return [] if args.blank? cond_text, cond_values = [], [] args.each do |str| next if str.blank? cond_text << "( %s )" % str.split.map{|w| "product_name LIKE ? "}.join(" AND ") cond_values.concat(str.split.map{|w| "%#{w}%"}) end all :conditions => [cond_text.join(" AND "), *cond_values] end 

这是一个使用自定义Ransack谓词的答案:

 # config/initializers/ransack.rb Ransack.configure do |config| config.add_predicate 'has_any_term', arel_predicate: 'matches_any', formatter: proc { |v| v.scan(/\"(.*?)\"|(\w+)/).flatten.compact.map{|t| "%#{t}%"} }, validator: proc { |v| v.present? }, type: :string end Ransack.configure do |config| config.add_predicate 'has_every_term', arel_predicate: 'matches_all', formatter: proc { |v| v.scan(/\"(.*?)\"|(\w+)/).flatten.compact.map{|t| "%#{t}%"} }, validator: proc { |v| v.present? }, type: :string end 

搜索表单将使用自定义谓词:

 # In your view # to search for any of the terms existing in my_field =search_form_for @search do |f| =f.search_field :my_field_has_any_term # to search for all of the terms existing in my_field =search_form_for @search do |f| =f.search_field :my_field_has_every_term 

双重引用的条款将自动被识别。