7

検索基準を提供するフォームを作成しました。

    = 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

Rails Geocoder gem の "Near" 機能に基づいて検索もできるようにしたいと考えています。既存のスコープを組み込む方法、または特にメタ検索またはランサックで「近い」スコープを使用する方法を知っている人はいますか?

これまでのところ、私の試みはすべて無駄でした。

4

1 に答える 1

10

これは、フォーム内に非search_form_forフィールドを追加するだけで、実際には非常に簡単に実現できます。

私の見解では(2つのフォームフィールドの違いに注意してください):

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

これにより、次のようなパラメータ文字列が生成されます。

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

次に、いくつかの条件付きロジックをコントローラーに配置して、これらのパラメーターを引き上げ、GeocoderとRansackを組み合わせることができます。「within」パラメータが存在するかどうかを確認します。存在する場合は、それが数値であることを確認します(to_iは数値以外の場合は0を返すため、> 0チェック)。

次に、ジオコーダーの「近く」とランサックの「検索」を組み合わせます。

「within」パラメーターがない場合(つまり、ユーザーが数値を入力しなかった場合)、ジオコーダービットなしで検索します。

最後にカミナリを使用しているので、検索結果の最後になります。

   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)

お役に立てれば!

于 2012-12-27T19:16:34.393 に答える