Personalizando suas ações de geocodificação ruby!

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 ActiveRecordmodelo 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_codemé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::Basenos dá vários métodos que podemos usar para fazer ações de filtragem semelhantes, incluindo coordindates, latitude, longitude, state, province, state_code, province_codee 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 .