Как читать значения из ActiveRecord

Я использую Gem http://Geocoder, и когда я вызываю: results = Geocoder.search("McCarren Park, Brooklyn, NY") мои результаты выглядят как здесь :

[#<Geocoder::Result::Google:0x007fc0e6a016e0 @data={"address_components"=>
[{"long_name"=>"McCarren Park", "short_name"=>"McCarren Park", "types"=>["point_of_interest", "establishment"]}, {"long_name"=>"776", "short_name"=>"776", "types"=>["street_number"]}, {"long_name"=>"Lorimer Street", "short_name"=>"Lorimer St", "types"=>["route"]}, {"long_name"=>"Williamsburg", "short_name"=>"Williamsburg", "types"=>["neighborhood", "political"]}, {"long_name"=>"Brooklyn", "short_name"=>"Brooklyn", "types"=>["sublocality_level_1", "sublocality", "political"]}, {"long_name"=>"Brooklyn", "short_name"=>"Brooklyn", "types"=>["locality", "political"]}, {"long_name"=>"Kings County", "short_name"=>"Kings County", "types"=>["administrative_area_level_2", "political"]}, {"long_name"=>"New York", "short_name"=>"NY", "types"=>["administrative_area_level_1", "political"]}, {"long_name"=>"United States", "short_name"=>"US", "types"=>["country", "political"]}, {"long_name"=>"11222", "short_name"=>"11222", "types"=>["postal_code"]}], "formatted_address"=>"McCarren Park, 776 Lorimer St, Brooklyn, NY 11222, USA", "geometry"=>{"location"=>{"lat"=>40.7214499, "lng"=>-73.9520707}, "location_type"=>"APPROXIMATE", "viewport"=>{"northeast"=>{"lat"=>40.72279888029149, "lng"=>-73.95072171970848}, "southwest"=>{"lat"=>40.7201009197085, "lng"=>-73.9534196802915}}}, "place_id"=>"ChIJtzAltURZwokRSNfNakChZPU", "types"=>["park", "point_of_interest", "establishment"]}, @cache_hit=nil>]

Как я могу прочитать переменные lat и lng из переменной results?


person Ponciusz    schedule 13.12.2015    source источник


Ответы (4)


Как говорит Андрей, это массив хэшей, вам нужно будет выбрать массив с переменными lat и lng, который, похоже, является хешем postal_code. Найдите хэш, в котором присутствует ключ «геометрия».

So,

location_results = results.data.select{|r| r['geometry']}.first
location_results['geometry']['location']['lat'] # 40.7214499
location_results['geometry']['location']['lng'] # 73.9520707
person SteveTurczyn    schedule 14.12.2015
comment
после первой строки у меня ошибка: NoMethodError: неопределенный метод `[]' для #‹Geocoder::Result::Google:0x007fc0e25f1450› - person Ponciusz; 14.12.2015
comment
Ах да, массив находится в атрибуте data. Я изменил свой ответ, дайте мне знать, если это работает лучше... - person SteveTurczyn; 14.12.2015

Из исходного кода:

# Takes a search string (eg: "Mississippi Coast Coliseumf, Biloxi, MS",
# "205.128.54.202") for geocoding, or coordinates (latitude, longitude)
# for reverse geocoding. Returns an array of <tt>Geocoder::Result</tt>s.

Итак, это простой массив.

Ознакомьтесь с этой документацией для получения дополнительной информации о запросах.

person Andrey Deineko    schedule 14.12.2015
comment
не работает, когда я пытаюсь, у меня есть это: NoMethodError: undefined method data for #<Array:0x007fc0e2679d28> - person Ponciusz; 14.12.2015
comment
@Ponciusz Оформить заказ сейчас, пожалуйста - person Andrey Deineko; 14.12.2015
comment
@Ponciusz Вы можете либо попробовать отредактированное сейчас, либо results.geometry.location.lng - person Andrey Deineko; 14.12.2015
comment
@Ponciusz хм. как получилось? - person Andrey Deineko; 14.12.2015

result = Geocoder.search("McCarren Park, Brooklyn, NY").first

And then simply call it like this, 
-> result.latitude and  
-> result.longitude

Но также обязательно проверьте результат, иногда ответ Geocoder API занимает больше времени ожидания, чем указано по умолчанию, и возвращает nil. Так что, если вы тоже столкнулись с этим, просто увеличьте значение тайм-аута в инициализаторах.

Geocoder::Configuration.timeout = 15 # измените 15 на любое значение, которое вы предпочитаете.

Дополнительные ссылки см. на https://github.com/alexreisner/geocoder#advanced-geocoding

person Devd    schedule 14.12.2015

location_results = results.data.select{|r| r['geometry']}.first

и у меня сейчас

["geometry",
{"location"=>{"lat"=>40.7214499, "lng"=>-73.9520707},
"location_type"=>"APPROXIMATE",
"viewport"=>{"northeast"=>{"lat"=>40.72279888029149, "lng"=>-73.95072171970848},
"southwest"=>{"lat"=>40.7201009197085,
"lng"=>-73.9534196802915}}}]

но после этого

location_results['geometry']['location']['lat']

я снова получаю ошибку:

TypeError: no implicit conversion of String into Integer
person Ponciusz    schedule 14.12.2015