将邻近度过滤器添加到用户搜索

时间:2015-06-20 22:52:25

标签: ruby-on-rails ruby postgresql proximity rails-geocoder

我们的应用程序设置了用户搜索,到目前为止只基于文本内容查询。

所以这就是我所拥有的:

在models / user.rb

def self.search(query)
  where("description ilike ?", "%#{query}%")
end
app / controllers / users_controller.rb中的

class UsersController < ApplicationController
  before_action :authorized?
  def index
    @users = User.all
    if params[:search]
      @users = User.search(params[:search]).order("created_at DESC")
    else
      @users = User.all.order('created_at DESC')
    end
  end

在views / index.html.erb

<%= form_tag(users_path, :method => "get", id: "search-form") do %>
  <%= text_field_tag :search, params[:search], placeholder: "Search Users" %>
  <%= submit_tag "Search", :name => nil %>
<% end %>

我们正在使用rails和postgres。已安装Geocoder gem。我们将当前纬度和经度存储在单独的列中。

我如何添加邻近搜索过滤器,以及我将采取哪些步骤进行MVC?

位置存储在我们的方案中,如此

 create_table "users", force: :cascade do |t|
    t.float    "latitude"
    t.float    "longitude"

2 个答案:

答案 0 :(得分:0)

是的,地理编码器主页没有太多信息。我在实际的README中找到了更多细节:

https://github.com/alexreisner/geocoder#readme

如果您想通过邮政编码进行搜索,则需要在表单中添加文本字段输入 - 我们可以将其命名为zip_code。如果您想要一个可变距离,还要添加一个带有表示距离的数值的选择标记,请调用此字段distance

然后在服务器端,您需要将zip转换为纬度和经度。

zip_result = Geocoder.search(params[:zip_code])
# Is an array of results, take the first one
if zip_result 
  result = zip_result.first
  lat = result.latitude
  lon = result.longitude

  # now we can search with our model: we are asking
  # Show me all Users within "distance_in_miles" of this geocoded
  # zip code
  distance_in_miles = params[:distance].to_i
  User.search(params[:query]).near([lat, lon], distance_in_miles)
end

这没有任何错误检查或验证 - 它基本上是一个概念验证。

答案 1 :(得分:0)

得到了它。我将用户控制器上的索引功能修改为

for object in object_list:
    if object.x == 10 and object.y == 10:
        current_object = object
        break