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