tutoriales tutorial rails learn book ruby-on-rails json jbuilder

ruby-on-rails - learn - ruby on rails tutoriales



Bucle JBuilder que produce hash (3)

Necesito un bucle que produzca hash, no una matriz de objetos. Tengo esto:

json.service_issues @service.issues do |issue| json.set! issue.id, issue.name end

que resulta:

service_issues: [ { 3: "Not delivered" }, { 6: "Broken item" }, { 1: "Bad color" }, { 41: "Delivery problem" } ]

Necesito este:

service_issues: { 3: "Not delivered", 6: "Broken item", 1: "Bad color", 41: "Delivery problem" }

¿Es posible hacer esto sin convertir el resultado de AR en hash manualmente?


Esta pregunta es bastante antigua, pero para cualquier persona que esté interesada en tener un hash de arreglos (objetos), puede usar el siguiente código:

@bacon_types.each do |bacon_type| json.set! bacon_type.name, bacon_type.bacons do |bacon| bacon.title bacon.title ... end


Jbuilder dev aquí.

Respuesta corta: sí. Es posible sin convertir la matriz de modelos en hash.

json.service_issues do @service.issues.each{ |issue| json.set! issue.id, issue.name } end

pero probablemente sería más fácil preparar el hash de antemano.

json.service_issues Hash[@service.issues.map{ |issue| [ issue.id, issue.name ] }]


Puedes hacerlo así.

Jbuilder.encode do |json| json.service_issues @service.issues.inject({}) { |hash, issue| hash[issue.id] = issue.name; hash } end

El código que genera la técnica hash puede entenderse siguiendo el ejemplo.

[1] pry(main)> array = [{id: 1, content: ''a''}, {id: 2, content: ''b''}] => [{:id=>1, :content=>"a"}, {:id=>2, :content=>"b"}] [2] pry(main)> array.inject({}) { |hash, element| hash[element[:id]] = element[:content]; hash } => {1=>"a", 2=>"b"}

El punto clave de inject para generar hash, devolver hash creado cada vez que se inserta un nuevo elemento. Sobre el ejemplo, se realiza por ; hash ; hash