2012-01-19 3 views
4

Я использую жемчужину ruby ​​geocoder для поиска по местоположению. Я хочу ограничить поиск мест, которые официально были запущены. Если кто-то ищет по zip, это легко использовать с регулярным выражением. Но если кто-то ищет по городу, мне нужно преобразовать город в почтовый индекс, проверить мою почтовую таблицу и, если положительно, вернуть результаты поиска.Ruby Geocoder gem чтобы найти почтовый индекс

geocoder api имеет секцию для обратного геокодирования:

reverse_geocoded_by :latitude, :longitude do |obj,results| 
    if geo = results.first 
    obj.city = geo.city 
    obj.zipcode = geo.postal_code 
    obj.country = geo.country_code 
    end 
end 
after_validation :reverse_geocode 

Это, очевидно, построен только для использования в модели. Но я пытаюсь использовать его в своем контроллере, но obj.zipcode не работает вообще. Geocoder.search ('san jose, ca'), кажется, возвращает то, что мне нужно, я просто не знаю, как добраться до него. Вот где я нахожусь:

if params[:search].present? 
#  coords = Geocoder.coordinates(params[:search]) 
    zip = Geocoder.search(params[:search]) 
    if Zip.where(:zip => (params[zip.zipcode]), :launch => true).exists? 
     addresses = Address.near(params[:search], 25, :order => :distance) 
     @profiles = addresses.map{ |ad| ad.profile }.uniq unless addresses.nil? 
     @title = "Addresses Near " + (params[:search]).to_s 
    else 
     if Zip.where(:zip => (params[zip.zipcode]), :nearlaunch => true).exists? 
     addresses = Address.near(params[:search], 25, :order => :distance) 
     @profiles = addresses.map{ |ad| ad.profile }.uniq unless addresses.nil? 
     @title = "We have not launched for your location but these are near by " + (params[:search]).to_s 
     else 
     redirect_to :controller => 'pages', :action => 'notlaunched' 
     end 
    end 

ответ

5

Попробуйте Area gem. Вы могли бы сделать что-то вроде:

"San Jose, CA".to_zip #=> ["95101", "95102", ... 
+0

Не работает в Швейцарии = _ = – Phil

1

Вы можете использовать, как это, чтобы получить почтовый индекс для любой широты и долготы

Geocoder.search([latitude, longitude]).first.postal_code 

Это можно использовать в контроллере или каких-либо других, чем модели файлов. Но геокодер также обеспечивает автоматическое преобразование, при котором таблица должна иметь требуемые имена столбцов. Для получения дополнительной информации посетите здесь geocoder