5

私は現在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つのセクションで文字列全体を検索するのではなく、の形式で入力された検索文字列

誰かが私を正しい方向に向けることができますか?

4

2 に答える 2

7

カスタム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

二重引用符で囲まれた用語は自動的に認識されます。

于 2016-08-12T19:15:25.670 に答える
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
于 2013-04-09T19:52:36.317 に答える