Ransack search,如何通过拆分输入搜索参数来搜索每个单词
Posted
技术标签:
【中文标题】Ransack search,如何通过拆分输入搜索参数来搜索每个单词【英文标题】:Ransack search, how to search for each word by splitting input search parameter 【发布时间】:2013-03-14 18:15:40 【问题描述】:我目前正在尝试使用ransack gem
在 Rails 中搜索模型。就目前而言,我正在使用基本设置。
控制器:
def index
@q = Person.search(params[:q])
@people = @q.result(:distinct => true)
end
查看:
<%= search_form_for @q do |f| %>
<%= f.label :name_cont %>
<%= f.text_field :name_cont %>
<%= f.submit %>
<% end %>
我设法找到了很多关于在多个字段上进行搜索的信息,但是,我还没有找到任何东西来帮助我拆分 :q
参数,从而使我能够搜索每个 (以search for ??? AND ??? AND ??? ...
的形式输入的搜索字符串中的未知数量)单词,而不是在一个部分中搜索整个字符串
有人能指出我正确的方向吗?
【问题讨论】:
我正面临着同一面墙...您找到任何解决方案了吗? 抱歉耽搁了,实际上采用了一种非洗劫的方法,因为它效果很好,我可以控制它!将使用我的解决方案更新帖子 【参考方案1】:我花了很多时间研究这个问题,但没有任何结果,我选择了一个自定义的、非洗劫的选项,效果很好。
在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 %>
在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
【讨论】:
我正在尝试这个,但我在最后一行出现错误“参数数量错误(1 代表 0)”【参考方案2】:这是一个使用自定义 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
双引号的术语将被自动识别。
【讨论】:
我建议在正则表达式中使用[[:alpha]]
而不是\w
,否则这会拆分带有变音符号的单词。
(或[[:alnum:]]
,如果您还想包含数字)以上是关于Ransack search,如何通过拆分输入搜索参数来搜索每个单词的主要内容,如果未能解决你的问题,请参考以下文章
在rails应用程序中使用Ransack搜索表单中的关联多对多关联
Rails,Ransack:如何在 HABTM 关系中搜索“所有”匹配项而不是“任何”匹配项