2011-09-29 14 views
7

Ho creato un modulo che fornisce criteri di ricerca:Utilizzando Meta Search o saccheggiare con Geocoder

= search_form_for @q do |f| 
    %h3 
    Search: 
    = f.label :category_id 
    %br 
    = f.collection_select :category_id_eq, Category.all, :id, :name, :include_blank => true 
    %br 
    = f.label "Sub-Category" 
    %br 
    = f.collection_select :subcategory_id_eq, Subcategory.all, :id, :name, :include_blank => true, :prompt => "select category!" 
    %br 
    = f.label "Contains" 
    %br 
    = f.text_field :title_or_details_cont 
    %br 
    = f.submit 

voglio essere in grado di fare anche una ricerca in base alla funzionalità "Near" della gemma Rails Geocoder . Qualcuno sa come incorporare uno scope esistente, o in particolare come usare lo scope "Near" con Meta Search o Ransack?

Finora, tutti i miei tentativi sono stati inutili.

risposta

8

Questo è in realtà abbastanza facile da ottenere semplicemente aggiungendo un campo non-search_form_for all'interno del modulo.

A mio parere (si noti la differenza nei due campi del modulo):

<%= search_form_for @search do |f| %> 
    <%= f.label :will_teach, "Will Teach" %> 
    <%= f.check_box :will_teach %> 

    <%= label_tag :within %> 
    <%= text_field_tag :within, params[:within], {:class => "span1"} %> miles 
<% end %> 

Questo produce quindi una stringa param come la seguente:

Parameters: {"utf8"=>"✓", "q"=>{"will_teach"=>"1"}, "within"=>"10", "commit"=>"Search"} 

si può quindi mettere un po 'la logica condizionale in il tuo controller per sollevare questi parametri e combinare Geocoder con Ransack. Controllo se il parametro "within" è presente, in tal caso, controlla che sia un numero (to_i restituisce 0 per qualsiasi cosa tranne un numero, quindi il controllo> 0).

Combino quindi il geocoder "near" con "search" di Ransack.

Se il parametro "within" non è presente (ovvero, l'utente non ha inserito un numero), quindi cerco senza i bit Geocoder.

Infine sto usando Kaminari, in modo che va alla fine dei risultati di ricerca:

if params[:within].present? && (params[:within].to_i > 0) 
     @search = Tutor.near(request.location.city,params[:within]).search(params[:q]) 
    else 
     @search = Tutor.search(params[:q]) 
    end 

    @tutors = @search.result.page(params[:page]).per(9) 

Spero che questo aiuti!

+2

Grazie. Questo dovrebbe probabilmente essere accettato come risposta. Ad ogni modo, mi ha davvero aiutato. Ta. – Will

+0

Qualcuno dovrebbe accettare questo – luisenrike

+0

@luisenrike è solo da cinque anni: D – DaveStephens