2011-10-28 6 views
5

Sto usando la gemma Ransack in Rails 3.1. Tutto funziona come previsto. Tuttavia, ho un modulo di ricerca che cercherà una persona che utilizza a Soundex column con cui sto avendo un problema.Rails - Come non valutare un campo in un modulo di ricerca di Ransack

Nel mio modulo ho un campo "given_name_soundex_cont", che un utente inserirà il nome "Joe". Il mio controller converte "joe" in un codice soundex, quindi Ransack cerca una corrispondenza nella colonna "given_name_soundex".

Tutti i record corrispondenti vengono restituiti e sembrano soddisfacenti, tranne per il fatto che il campo in cui l'utente ha inserito la parola "joe" ora mostra invece il valore soundex (ovviamente perché ho modificato il parametro).

Quindi ho pensato di aggiungere un campo "given_name_cont" e nascondere il campo "given_name_soundex_cont", ma ora Ransack vuole includere "given_name_cont" nella query, che non desidero.

Qualcuno sa come posso includere campi in un modulo di ricerca di Ransack senza che Ransack li stia effettivamente valutando. In questo modo posso specificare quali campi sono da valutare e quali no.

Se aiuta questo è quello che ho in mio controller:

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 

E a mio avviso:

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

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

risposta

0

Si potrebbe riutilizzare params[:q][:given_name_soundex] in immagine per sovrascrivere il valore passato a #ransack/#search.

1

Creare un ransacker che formatta il parametro. Non ho provato questo, ma penso che funzionerà (via 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

volevo ottenere qualcosa di simile, cioè, sostituire i spazi bianchi in input del cliente da parte del jolly SQL %, in modo che il campo di ricerca "Foo Bar" farebbe match "Foo Bar", ma anche " Foomster Q. Bar "e" Foo Glolubar ". Volevo anche aggiungere il carattere jolly all'inizio e alla fine del parametro di ricerca effettivo, quindi che "Fiefoo Newton Barrister" sarebbe anche una corrispondenza.

Ecco come. Le parti pertinenti 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 

Le parti rilevanti della vista app/views/customers/index.html.erb (il markup span4, span8 e btn btn-large btn-primary è fornita da 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> 

si noterà la predicati di ricerca customer_name_whitespaces_match_anything e customer_address_whitespaces_match_anything. Questi si riferiscono a un predicato di ricerca personalizzato che ho definito nel file config/initializers/ransack.rb.Le sue contenuti sono:

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 

Ora il termine di ricerca è munged dal predicato personalizzato prima che sia dato a SQL query, ma dopo la ricerca, i campi di ingresso del modulo di ricerca mostrano ancora il termine di ricerca l'input dell'utente in origine .

(Nei risultati della ricerca, ho un link dal nome del cliente per l'individuo cliente, che farà sì che la vista app/views/customers/show.html.erb di essere caricato.)

Problemi correlati