使用元搜索或Ransack与Geocoder

时间:2011-09-29 02:43:47

标签: ruby-on-rails ransack rails-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

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

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

2 个答案:

答案 0 :(得分: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 %>

然后生成如下的参数字符串:

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

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

希望这有帮助!

答案 1 :(得分:1)

还有其他人有类似的问题: Integrating meta_search gem in index with existing geocoder gem search (rails)

当然它不一样,但也许他找到了解决方案。

明天我会调查,因为我还需要将它实现到我的应用程序中。如果我找到解决方案,我会及时通知你。)