2015-11-08 3 views
-1

Я использую api Bandsintown для захвата дат концерта, на основе которых художники следуют на моем сайте и где находится пользователь. Прямо сейчас у меня возникают проблемы с итерацией многомерного массива данных, которые я возвращаю в ответ.Итерирование по многомерному массиву для захвата определенных значений ruby ​​

Цель

Чтобы перебрать массив массивов, а затем захватить имя для художников, чтобы отобразить его на мой взгляд.

Я могу захватить данные, которые я хочу с помощью следующего кода внутри моего контроллера:

class CalendarController < ApplicationController 
    require 'uri' 

    def index 
    @user = current_user 
    @hash_version_array = [] 

    @user.follows.each do |follow| 
     response = HTTParty.get("http://api.bandsintown.com/artists/#{URI.escape(follow.artist_name)}/events/search.json?api_version=2.0&app_id=el_proyecto_de_la_musica&location=use_geoip") 
     @hash_version = JSON.parse(response.body) 

     @hash_version_array << @hash_version 
    end 

    @hash_version_array 
    end 

    def show 
    end 
end 

код выше дает следующие результаты внутри моего @hash_version_array (нажмите here для результатов, легче показать через gist на github)

Я застреваю при попытке перебрать @hash_version_array, чтобы захватить имя каждого художника.

ПОПЫТКА 1

[9] pry(#<CalendarController>)> @hash_version_array.each do |sub_array| 
[9] pry(#<CalendarController>)* sub_array.each do |artist| 
[9] pry(#<CalendarController>)*  artist["artists"]["name"]  
[9] pry(#<CalendarController>)* end 
[9] pry(#<CalendarController>)* end 

Результаты в

TypeError: no implicit conversion of String into Integer 
from (pry):96:in `[]' 

Попытка 2

[8] pry(#<CalendarController>)> @hash_version_array.each do |sub_array| 
[8] pry(#<CalendarController>)* sub_array.each do |artist| 
[8] pry(#<CalendarController>)*  artist["artists"].each do |artist| 
[8] pry(#<CalendarController>)*  artist["name"] 
[8] pry(#<CalendarController>)*  end 
[8] pry(#<CalendarController>)* end 
[8] pry(#<CalendarController>)* end 

Результаты в том же значении для меня @hash_version_array, чтобы начать с

+0

Причину вы получили этот результат что 'каждый' возвращает свой приемник. –

+0

Ваш хэш содержит несколько имен исполнителя. Вы хотите извлечь их все в один массив? –

+1

Ваш вопрос можно улучшить несколькими способами. 1. Не следует указывать ссылки на данные или код. Если ссылка сломана, вопрос станет неполным для читателей в будущем. 2. Ваш хэш имеет гораздо больше ключей, чем необходимо для целей вопроса. Откиньте его до самого маленького хеша, необходимого, чтобы сделать вашу мысль. Покажите это в своем вопросе и дайте ему имя (например, 'my_hash = {...}', чтобы читатели могли ссылаться на это имя в комментариях и ответах без необходимости его определения. 3. Покажите желаемый результат для этого хэша 4. Удалите код «захватить данные», если это не относится к вашему вопросу. –

ответ

0

Чтобы получить имя исполнителя, вы будете получать его через следующую структуру:

artist[0]["artists"][0]["name"] 

Я оставлю это до вас, чтобы сделать код более надежным.

0

Хеш словарной как коллекция уникальных ключей и их значение

hash = {my_key: my_value} 

так что если вы хотите, чтобы получить value просто использовать hash['my_key']docs

hash.each do |key,value| 
     key['my_key'] 
    end 
+0

Пожалуйста, добавьте некоторое объяснение в свой ответ. – Haris