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”功能进行搜索。有谁知道如何合并现有范围,或者特别是如何将“近”范围与 Meta Search 或 Ransack 一起使用?

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

4

1 回答 1

10

这实际上很容易通过在表单中​​添加一个 non-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 表示除数字之外的任何内容,因此检查 > 0)。

然后我将 Geocoder “near” 与 Ransack 的 “search” 结合起来。

如果“内部”参数不存在(即用户没有输入数字),那么我会在没有地理编码器位的情况下进行搜索。

最后,我使用 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)

希望这可以帮助!

于 2012-12-27T19:16:34.393 回答