2013-03-25 24 views
1

我目前正在試驗使用ransack gem在Rails中對模型進行搜索。就目前而言,我正在使用基本設置。Ransack搜索,如何通過拆分輸入搜索參數來搜索每個單詞

控制器:

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 ??? ...的形式輸入的搜索字符串中的每個(未知數量)字,而不是在一個部分中搜索整個字符串

有人能指出我正確的方向嗎?

+0

我正面對同一堵牆......您是否找到任何解決方案? – phron 2013-04-07 18:11:48

+0

對不起,延遲,實際上去了一個非ransack方法,因爲它工作得很好,我可以控制它!將更新與我的解決方案 – Texas 2013-04-09 19:43:13

回答

1

花了大量的時間來看這個沒有結果,我選擇了一個非常好的自定義,非ransack選項。

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 
+0

其他解決方案使用ransack https://github.com/ernie/ransack/issues/218 – phron 2013-04-23 14:56:02

+0

我想這個,但我在最後一行得到一個錯誤「錯誤數量的參數( 1代表0)「 – unclesol 2016-07-23 13:13:20

0

下面是一個使用自定義洗劫謂詞答案:

# 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 

雙引號的條款將被自動識別。