Introdução
Geocoder é uma gema Ruby que permite armazenar facilmente informações de localização sobre um determinado conjunto de objetos e, em seguida, executar métodos relacionados à localização neles. Por exemplo, descobrir quais outros usuários estão próximos de um determinado usuário.
Modificando Ações de Geocode
Para o cenário de um usuário atribuindo uma localização de cidade em seu perfil, uma ação típica de geocodificação em um ActiveRecord
modelo pode ser assim:
geocoded_by :city
Isso funciona bem se a cidade for única, mas e se outra cidade com o mesmo nome existir em outro país daquele em que nosso usuário está, como especificaremos a cidade correta?
Felizmente, a ação geocoded_by leva um bloco com dois parâmetros, o objeto que estamos geocodificando (prof no exemplo abaixo) e o conjunto dos resultados retornados pela consulta de geocodificação (resultados):
geocoded_by :city do |prof,results|
if result = results.select{|res| res.country_code == "GB" }.first
unless (result.latitude.nil? || result.longitude.nil?)
prof.latitude = result.latitude
prof.longitude = result.longitude
end
result.coordinates
end
end
Você notará que estamos usando o res.country_code
método para selecionar o primeiro resultado do Reino Unido (para um site imaginário apenas no Reino Unido, neste caso). Portanto, esse código armazenaria a localização da primeira cidade correspondente no Reino Unido.
Mais informações
Geocoder::Result::Base
nos dá vários métodos que podemos usar para fazer ações de filtragem semelhantes, incluindo coordindates
, latitude
, longitude
, state
, province
, state_code
, province_code
e country
. Dependendo de qual provedor de pesquisa você está usando, você também pode usar alguns métodos personalizados, todos detalhados na fonte no Github . Para obter mais informações sobre como começar a usar o Geocoder, consulte este ótimo post sobre Railscasts .