2011-09-29 5 views
7

Został utworzony formularz, który dostarcza kryteriów:Korzystanie Meta Search lub plądrować z 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 

Chcę, aby móc także zrobić wyszukiwania w oparciu o „near” funkcjonalności gem Rails geocoder . Czy ktokolwiek wie, jak włączyć istniejący zakres, czy w szczególności, jak wykorzystać zasięg "zbliżony" do Meta Search lub Ransack?

Do tej pory wszystkie moje próby były daremne.

Odpowiedz

8

Jest to dość łatwe do osiągnięcia po prostu przez dodanie pola non-search_form_for w formularzu.

Moim zdaniem (zwróć uwagę na różnicę w tych dwóch pól formularza):

<%= 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 %> 

to wtedy wytwarza ciąg param jak następuje:

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

Następnie można umieścić pewną warunkową logikę do swój kontroler, aby odkurzyć te parametry i połączyć Geocoder z Ransack. Sprawdzam, czy obecny jest parametr "within", jeśli tak, sprawdź, czy jest to liczba (to_i zwraca 0 dla niczego poza liczbą, stąd kontrola> 0).

Następnie łączę Geokodera "blisko" z "przeszukaniem" Ransacka.

Jeśli nie ma parametru "within" (tzn. Użytkownik nie wprowadził numeru), to szukam bez bitów Geocoder.

Wreszcie Używam Kaminari tak, że idzie na końcu wyników wyszukiwania:

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) 

nadzieję, że to pomaga!

+2

Dziękuję. To powinno być prawdopodobnie zaakceptowane jako odpowiedź. Tak czy inaczej, naprawdę mi to pomogło. Ta. – Will

+0

Ktoś powinien zaakceptować to – luisenrike

+0

@luisenrike to tylko pięć lat: D – DaveStephens