使用元搜索或Ransack与Geocoder

use*_*203 7 ruby-on-rails rails-geocoder ransack

我创建了一个提供搜索条件的表单:

    = 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
Run Code Online (Sandbox Code Playgroud)

我希望能够根据Rails Geocoder gem的"Near"功能进行搜索.有没有人知道如何合并现有的范围,或者特别是如何在Meta Search或Ransack中使用"近"范围?

到目前为止,我的所有尝试都是徒劳的.

Dav*_*ens 8

实际上,只需在表单中添加非search_form_for字段即可轻松实现.

在我看来(注意两个表单字段的区别):

<%= 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 %>
Run Code Online (Sandbox Code Playgroud)

然后生成一个如下所示的参数字符串:

Parameters: {"utf8"=>"?", "q"=>{"will_teach"=>"1"}, "within"=>"10", "commit"=>"Search"}
Run Code Online (Sandbox Code Playgroud)

然后,您可以将一些条件逻辑放入您的控制器中以保持这些参数,并将Geocoder与Ransack结合使用.我检查是否存在"within"参数,如果是,请检查它是否为数字(to_i除了数字之外的任何内容都返回0,因此> 0检查).

然后我将Geocoder"近"与Ransack的"搜索"结合起来.

如果"within"参数不存在(即用户没有输入数字),那么我在没有Geocoder位的情况下进行搜索.

最后我正在使用Kaminari,因此搜索结果的结尾:

   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)
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!

  • 谢谢.这可能应该被接受为答案.无论哪种方式,它确实帮助了我.助教. (2认同)