0

我正在尝试从给定位置获取附近的用户。我有用户的纬度和经度(我从他们的地址中取出)。

现在,当我搜索“NC”之类的术语时,它会显示一些结果,但是当我使用国家名称“Unites States”进行搜索时,它必须显示所有结果,但它不会显示任何结果。

我正在为此使用Geocoder gem。这就是我正在做的事情:

控制器 :

@user = User.near(params[:search], 20, :order => :distance)

模型:

geocoded_by :address1 

看法 :

 Displaying all the results returned from @user

任何想法我应该怎么做,即使我用国家名称搜索它也会返回所有结果。

4

2 回答 2

1

当地理编码器收到类似“美国”的信息时,它会选择一个中心坐标对,然后从中搜索。因此,在您的情况下,它将搜索距美国中心 20 英里范围内的用户。

您想要做的是对搜索进行地理编码,然后找出它是哪种输入(国家等)

因此,例如,在您的控制器中:

def search
  search = Geocoder.search(params[:search]).first

  if search.types.includes?('country')
    @users = User.where(country: search.address)
  else
    @users = User.near(search.coordinates, 20) # Will be ordered by distance by default
  end
end

您必须将地址组件存储在数据库中。

获得一致数据的最佳方法是运行自定义地理编码回调:

class User < ActiveRecord::Base
  geocoded_by :address do |obj, results|
    if result = results.first
      obj.street = result.street_address
      obj.zip = result.postal_code
      obj.city = result.city
      obj.country = result.country
      obj.latitude = result.latitude
      obj.longitude = result.longitude
    end
  end

  after_validation :geocode, if: :address_changed?

  def address
    "#{street}, #{zip} #{city}, #{country}"
  end

  def address_changed?
    street_changed? || city_changed? || zip_changed? || country_changed?
  end
end
于 2013-09-05T22:41:16.960 回答
0

@delba 接受的答案很好,只有一个小错字,也就是说,Ruby 没有:includes?数组的谓词,但是:include?. 所以应该是search.types.include?('country')

于 2016-03-28T14:09:31.547 回答