搜索附近国家/地区名称不使用地理编码器的位置

时间:2013-07-30 10:35:31

标签: ruby-on-rails ruby ruby-on-rails-3 rails-geocoder

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

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

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

控制器:

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

型号:

geocoded_by :address1 

查看:

 Displaying all the results returned from @user

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

2 个答案:

答案 0 :(得分:1)

当Geocoder收到类似“US”的内容时,它会选择一个中心坐标对,然后从中进行搜索。因此,在您的情况下,它将搜索距离美国中心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

答案 1 :(得分:0)

@delba接受的答案很棒,只有一个小错误,就是Ruby没有数组的<style> div { border: 2px solid black; } #main { width: 107px; height: 107px; padding: 0; text-align: center; font-size: 10px; } #tl, #tr, #bl, #br { width: 45px; height: 45px; margin-top:3px; margin-left:3px; float:left; } #bl, #br { margin-bottom:3px; } </style> 谓词,而是:includes?。 所以它应该是:include?