当地理编码器收到类似“美国”的信息时,它会选择一个中心坐标对,然后从中搜索。因此,在您的情况下,它将搜索距美国中心 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