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

Ruby on rails 搜索,如何通过拆分输入搜索参数来搜索每个单词,ruby-on-rails,ruby-on-rails-3,search,ransack,Ruby On Rails,Ruby On Rails 3,Search,Ransack,我目前正在尝试使用ransackgem对Rails中的模型进行搜索。目前,我使用的是基本设置 控制器: def index @q = Person.search(params[:q]) @people = @q.result(:distinct => true) end 视图: 我已经找到了很多关于在多个字段上进行搜索的信息,但是,我没有找到任何东西来帮助我拆分:q参数,从而使我能够搜索以搜索???的形式输入的搜索字符串中的每个(未知数量)单词???那么???然后呢,而不是在

我目前正在尝试使用
ransackgem
对Rails中的模型进行搜索。目前,我使用的是基本设置

控制器:

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


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


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

我花了大量时间研究这个问题,但没有结果,所以我选择了一个定制的、非搜掠的选项,它工作得非常好

View.html.erb中

<%= form_tag siteindex_search_allproducts_path, :method => 'get' do %>
    <b>Search: </b> <%= text_field_tag :search, params[:search] %>
    <%= submit_tag "Search", :name => nil %>
<% end %>
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
def self.search(*args)
如果args.blank,是否返回[]?
cond_文本,cond_值=[],[]
args.each do|str|
下一步如果str.blank?
cond_text[cond_text.join(“AND”),*cond_值]
结束

以下是一个使用自定义搜索谓词的答案:

# 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

双引号术语将被自动识别。

我面对的是同一堵墙。。。你找到什么解决办法了吗?很抱歉耽搁了,实际上是采用了一种非搜查的方法,因为它同样有效,我可以控制它!将用我的解决方案更新帖子我正在尝试,但在最后一行“参数数量错误(1代表0)”中出现错误。我建议在正则表达式中使用
[[:alpha]]
而不是
\w
,否则这将拆分包含Umlauts的单词。(或者
[:alnum:]
如果您还想包含数字)
# 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