2011-10-28 6 views
5

Estoy usando Ransack Gem in Rails 3.1. Todo funciona como se espera Sin embargo, tengo un formulario de búsqueda que buscará a una persona usando a Soundex column con la que estoy teniendo un problema.Rails - Cómo no evaluar un campo en un formulario de búsqueda de Ransack

En mi forma tengo un campo "given_name_soundex_cont", que un usuario ingresará el nombre "Joe". Mi controlador que convierte "joe" a un código soundex, y luego Ransack busca una coincidencia en la columna "given_name_soundex".

Todos los registros coincidentes son devueltos y parece correcto, excepto que el campo donde el usuario ingresó la palabra "joe" ahora muestra el valor soundex (por supuesto, porque cambié el parámetro).

Así que pensé que podría simplemente agregar un campo "given_name_cont" y ocultar el campo "given_name_soundex_cont", pero ahora Ransack quiere incluir "given_name_cont" en la consulta, que no quiero.

¿Alguien sabe cómo puedo incluir campos en un formulario de búsqueda de Ransack sin que Ransack realmente los evalúe? De esta forma puedo especificar qué campos no se evaluarán y cuáles no.

Si se ayuda a que esto es lo que tengo en el controlador:

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 

Y en mi opinión:

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

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

Respuesta

0

Se puede reutilizar params[:q][:given_name_soundex] en su opinión, para anular el valor pasado a #ransack/#search.

1

Crea un ransacker que formatea el parámetro. No he intentado esto, pero creo que funcionará (a través del 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

que quería lograr algo similar, es decir, sustituir los espacios blancos de la aportaciones de los clientes por el comodín SQL %, por lo que el campo de búsqueda "Foo bar" haría partido "Foo bar", sino también " Foomster Q. Bar "y" Foo Glolubar ". También quería para agregar el comodín al principio y al final del parámetro de búsqueda real, por lo que que "Fiefoo Newton Barrister" también sería una coincidencia.

He aquí cómo. Las partes pertinentes de 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 

las partes pertinentes de la vista app/views/customers/index.html.erb (el span4, span8 y btn btn-large btn-primary marcado es proporcionada por 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> 

Se dará cuenta de los predicados de búsqueda customer_name_whitespaces_match_anything y customer_address_whitespaces_match_anything. Estos se refieren a un predicado de búsqueda personalizado que definí en el archivo config/initializers/ransack.rb.Sus contenidos son:

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 

Ahora el término de búsqueda se munged por el predicado personalizado antes de que se le da a SQL consulta, pero después de la búsqueda, campos de entrada del formulario de búsqueda muestran todavía el término búsqueda de la entrada del usuario originalmente .

(En los resultados de la búsqueda, tengo un enlace desde el nombre del cliente a la persona cliente, lo que provocará que la vista sea app/views/customers/show.html.erb cargado.)

Cuestiones relacionadas