2011-10-28 12 views
5

でフィールドを評価しない方法。すべてが期待どおりに機能します。しかし、私は問題を抱えているa Soundex columnを使用している人を検索する検索フォームを持っています。私のフォームでRailsの - 私はRailsの3.1に<a href="https://github.com/ernie/ransack" rel="noreferrer">Ransack</a>宝石を使用しています掻き回す検索フォーム

は、私は、ユーザーが名前「ジョー」を入力することを、「given_name_soundex_cont」フィールドを持っています。私のコントローラーは "joe"をsoundexコードに変換し、Ransackは "given_name_soundex"列で一致するものを探します。

(私はPARAMを変更したため、もちろん)すべての一致するレコードは、ユーザが現在「ジョー」の単語を入力するフィールドが代わりにSOUNDEX値を示したことを除いて、返されると罰金だされています。

"given_name_cont"フィールドを追加して "given_name_soundex_cont"フィールドを非表示にすることができましたが、Ransackはクエリに "given_name_cont"を含めたいと思っています。

誰も私が掻き回すは、実際にそれらを評価せずに掻き回す検索フォームのフィールドを含めることができる方法を知っています。そうすれば、どのフィールドが評価され、どのフィールドが評価されないのかを指定することができます。

def index 

    if !params[:q].blank? # nil.blank? and [].blank? are true 
    search_params = params[:q] 
    search_params[:given_name_soundex_cont] = convert_to_soundex(search_params[:given_name_soundex_cont]) 
    @q = Person.search(search_params) 
    @results = @q.result.limit(50) 
    else 
    @q = Person.search(params[:q]) 
    @results = [] 
    end 

end 


private 
    def convert_to_soundex(text) 
     Text::Soundex.soundex(text.to_s) 
    end 

そして、私の見解では:

それはこのことができます場合は、私は私のコントローラに持っているものである

<%= search_form_for @q do |f| %> 
    <label>Given Name:</label> 
    <%= f.text_field :given_name_soundex_cont %> 

    <%= f.submit %> 
<% end %> 

答えて

0

あなたは再利用できparams[:q][:given_name_soundex]をに渡された値を上書きするためにあなたのビューで#ransack/#search

1

パラメータをフォーマットransackerを作成します。私はこれを試していないが、私はそれが動作すると思う(https://github.com/ernie/ransack/issues/36経由)。

ransacker :given_name_soundex, :formatter => proc {|v| Text::Soundex.soundex(v)} do 
    parent.table[:given_name_soundex] 
end 
0

私は「検索フィールド「はFooバーは」 マッチ「はFooバー」なるように、SQLのワイルドカード%によって 顧客入力で空白を置き換える、つまり、似たような達成したかったが、また、 「Foomster Q. Bar」と「Foo Glolubar」があります。私もそう 「Fiefooニュートン法廷弁護士は」また試合になるだろうと、実際の検索パラメータの最初と最後にワイルドカードを追加する を望んでいました。

ここで説明します。 app/controllers/customers_controller.rbの関連部分:

class CustomersController < ApplicationController 
    # GET /customers 
    # GET /customers.json 
    def index 
    @search = Customer.search(params[:q]) 
    @customers = @search.result 
    ... 
    respond_to do |format| 
     format.html # index.html.erb 
     format.json { render json: @customers } 
    end 
    end 
    ... 
end 

ビューapp/views/customers/index.html.erbspan4span8btn btn-large btn-primaryマークアップが Twitter's Bootstrap frameworkによって提供される)の関連部分:

<% require 'action_view' %> 
<div class="row"> 
... 
    <div class="span4"> <!-- The search criteria --> 
    ... 
    <%= search_form_for @search do |f| %> <!-- this is a Ransack-provided form --> 
     <div class="field"> 
     <%= f.label :customer_name_whitespaces_match_anything, "Name is or contains:" %> 
     <%= f.text_field :customer_name_whitespaces_match_anything, class: "my-textbox" %> 
     ... 
     <%= f.label :customer_address_whitespaces_match_anything, "Address is or contains:" %> 
     <%= f.text_field :customer_address_whitespaces_match_anything, class: "my-textbox" %> 
     ... 
     </div> 
     <br/> 
     <div class="actions"> 
     <%= f.submit "Search", class: "btn btn-large btn-primary" %> 
     </div> 
    <% end %> 
    </div> 
    <div class="span8"> <!-- The search results --> 
    ... 
    <table border="1" cellpadding="5"> 
     <tr> 
     <th><%= sort_link(@search, :customer_name, "Customer name") %></th> 
     ... 
     <th><%= sort_link(@search, :customer_address, "Address") %></th> 
     ... 
     </tr> 
     <% @customers.each do |c| %> 
     <tr> 
      <td><%= link_to c.customer_name, customer_path(c, search: @search) %></td> 
      ... 
      <td><%= c.customer_address %></td> 
      ... 
     </tr> 
     <% end %> 
    </table> 
    </div> 
... 
</div> 

あなたが検索述語に気付くでしょうcustomer_name_whitespaces_match_anything およびcustomer_address_whitespaces_match_anything。これらは、ファイルconfig/initializers/ransack.rbで定義したカスタム検索述語 を参照しています。その 内容は以下のとおりです。それはSQL クエリに与えられています前に、

Ransack.configure do |config| 
    config.add_predicate 'whitespaces_match_anything', 
    :arel_predicate => 'matches', # so we can use the SQL wildcard "%" 
    # Format the incoming value: replace spaces by the SQL wildcard "%". 
    :formatter => proc {|v| "%"+v.gsub(" ","%")+"%"} 
end 

今すぐ検索語は、カスタム述語によってマングドされていますが、検索後、検索フォームの入力フィールドがまだもともと 検索語ユーザー入力を表示します。

(検索結果で、私はビューapp/views/customers/show.html.erbが がロードされるようになります個々 顧客への顧客の名前からリンクを持っている。)

関連する問題