¿Cómo puedo iterar a través de este documento json usando ruby?

Tengo un bloque de código Ruby, como sigue:

require "elasticsearch" require "json" search_term = "big data" city = "Hong Kong" client = Elasticsearch::Client.new log: true r = client.search index: 'candidates', body: { query: { bool: { must: [ { match: { tags: search_term } }, { match: { city: city } } ] } } } 

Produce múltiples devoluciones como esta:

 {"_index":"candidates","_type":"data", "_id":"AU3DyAmvtewNSFHuYn88", "_score":3.889237, "_source":{"first":"Kota","last":"Okayama","city":"Tokyo","designation":"Systems Engineer","email":"user@hotmail.co.jp","phone":"phone","country":"Japan","industry":"Technology","tags":["remarks","virtualization big data"]}} 

Quiero recorrerlo y extraer varios elementos. Yo he tratado

  data = JSON.parse(r) data.each do |row| puts row["_source"]["first"] end 

y el error es:

 no implicit conversion of Hash into String (TypeError) 

¿Cuál es la mejor manera de avanzar en este tipo?

Tengo la solución, espero que ayude a alguien más. Me tomó horas de juguetear y experimentar. Aquí está:

 require "elasticsearch" require "json" search_term = "big data" city = "Tokyo" client = Elasticsearch::Client.new log: true h = client.search index: 'swiss_candidates', body: { query: { bool: { must: [ { match: { tags: search_term } }, { match: { city: city } } ] } } } data = JSON.parse(h.to_json) data["hits"]["hits"].each do |r| puts r["_id"] puts r["_source"]["first"] puts r["_source"]["tags"][1] puts r["_source"]["screened"][0] end 

Lo importante parece ser convertir el resultado de la búsqueda de elastics en algo que sea compatible con el Ruby.

JSON.parse espera una String contiene un documento JSON, pero le está pasando el Hash que devolvió de client.search .

No estoy completamente seguro de lo que estás tratando de lograr con eso, por qué quieres analizar algo que ya es un Ruby Hash en un Ruby Hash .