2017-10-26 13 views
0

私は検索結果ページに検索フィルターを組み込もうとしています。ユーザーが検索し、その結果がsearch.html.erbに表示されたら、フィルターを使用するようにします。フィルタは検索結果自体から派生します。Rails 5検索フィルター複数の選択

つまり、私は車の達人が何をするかを複製したいと思います。

<%= addfilters "transmission", "Automatic" %> 

とヘルパーを定義する:あなたは私のような単一のフィルタのリンクを試してみましたなど、作るモデル、価格、その後フィルターがあなたの検索車両トリムに応じて、ファセット検索するためのオプションを与えるだろう

を伝送を使用して検索します

  1. 使用する複数の選択F:

    def addfilters(column, title) 
         link_to title, params.permit(:NewUsed, :category, :subcategory, :minprice, :maxprice, :location, :radius).merge({:"#{column}" => "Automatic"}) 
    end 
    

    しかし、どのように私はできのような方法iltersを使って検索結果を微調整する検索フォームから取得します。

  2. 検索結果を使用してこれらのフィルタオプションを設定し、結果を保持し、新しい複数の値をパラメータにマージします。私のようなものを取得したい
  3. car gurus

私は掻き回すかfilterrificなどの外部依存や宝石を使用したくないが、私は最初からファセット検索を学びたいと思っています。必要に応じて

、私の検索フォームのコードは次のとおりです。

<div id="Make" class="tabcontent1"> 
      <section class="formclass"> 

       <!-- f.select :transmission, ['Automanual','Automatic','Automatic 4 Speed','Automatic 5 Speed','Automatic 6 Speed','CVT','Manual'] --> 
       <h3 style = "color:#F00000; text-align: center;"><strong><%= @carcount %> CARS LISTED!</strong></h3> 

       <hr> 

       <h3 style = "color:#7C064D;"><span class="glyphicon glyphicon-search"></span> <strong>SEARCH CARS FOR SALE BY MAKE</strong></h3> 
       <%= form_tag search_listings_path, method: :get, class: 'navbar-form navbar-center' do |f| %> 

       <div class= "col-xs-12 col-sm-12 col-lg-12 col-md-12"> 
        <%= select_tag :NewUsed, "<option>New</option><option>Used</option>".html_safe, style: "width: 100%; margin: 1% 0;" %> 
       </div> 

       <div class= "col-xs-6 col-sm-6 col-lg-6 col-md-6"> 
        <%= select_tag :category, include_blank: true, style: "width: 100%; margin: 1% 0;" %> 
       </div> 

       <div class= "col-xs-6 col-sm-6 col-lg-6 col-md-6"> 
        <%= select_tag :subcategory, include_blank: true, style: "width: 100%; margin: 1% 0;" %> 
       </div> 
       <!-- <div class= "col-xs-12 col-sm-12 col-lg-12 col-md-12"> --> 
        <div class= "col-xs-6 col-sm-6 col-lg-6 col-md-6"> 
         <%= text_field_tag :minprice, nil, placeholder: 'Min Price', style: "width: 100%; margin: 1% 0;" %> 
        </div> 
        <div class= "col-xs-6 col-sm-6 col-lg-6 col-md-6"> 
         <%= text_field_tag :maxprice, nil, placeholder: 'Max Price', style: "width: 100%; margin: 1% 0;" %> 
        </div> 
       <!-- </div> --> 
       <div class= "col-xs-6 col-sm-6 col-lg-6 col-md-6"> 
        <%= text_field_tag :location, nil, placeholder: 'Near', style: "width: 100%; margin: 1% 0;" %> 
       </div> 
       <div class= "col-xs-6 col-sm-6 col-lg-6 col-md-6"> 
        <%= text_field_tag :radius, nil, placeholder: 'Radius', style: "width: 100%; margin: 1% 0;" %> 
       </div> 


       <div class= "col-xs-12 col-sm-12 col-lg-12 col-md-12">    
        <%= submit_tag 'Search', class: 'btn btn-danger', style: "width: 100%;" %> 
       </div> 
       <% end %>  
      </section> 
     </div> 

答えて

0

このようなモジュールは

module Filterable 
    extend ActiveSupport::Concern 

    module ClassMethods 
    def filter(filtering_params) 
     results = self.where(nil) 
     filtering_params.each do |key, value| 
     results = results.public_send(key, value) if value.present? 
     end 
     results 
    end 
    end 
end 


#Controller 
def index 
    @products = Product.filter(params.slice(:status, :location, :over_price, :under_price)) 
end 

#class Car < ApplicationRecord 
class Product < ApplicationRecord 
    include Filterable 

    scope :status, -> (status) { where status: status } 
    scope :location, -> (location_id) { where location_id: location_id } 
    scope :over_price, -> (price) { where "price > ?", price) } 
    scope :under_price, -> (price) { where "price < ?", price) } 

    #continue adding more scopes here 
end 
+0

オーケーを働くだろう。しかし、SQLでelasticsearchのような集計/ファセットを使用し、ビュー内の検索結果に応じてフィルタをユーザに与える方法はありますか? クラスメソッドを検索した後、検索結果をグループに集約し、上の図のように左に表示し、右側の集計に数値を表示すると、検索結果が変更されます(複数選択することもできます)。 –

+0

新しいアイテムが選択されるたびにクエリを再評価しますか?あなたはAjaxを使用する必要があります。 – Sean

+0

また、あなたはそのトピックについて別の質問をする必要があると思います。それは私の答えを非常に長くし、私はすべてに適切に答えることができるかどうか確信していません。 – Sean