Цикл JBuilder, создающий хэш
Мне нужен цикл, который создает хэш, а не массив объектов. У меня есть это:
json.service_issues @service.issues do |issue|
json.set! issue.id, issue.name
end
что результаты:
service_issues: [
{
3: "Not delivered"
},
{
6: "Broken item"
},
{
1: "Bad color"
},
{
41: "Delivery problem"
}
]
Мне нужно это:
service_issues: {
3: "Not delivered",
6: "Broken item",
1: "Bad color",
41: "Delivery problem"
}
Возможно ли это сделать без преобразования AR-результата в хэш вручную?
Ответы
Ответ 1
Jbuilder dev здесь.
Короткий ответ: Да. Это возможно без преобразования массива моделей в хэш.
json.service_issues do
@service.issues.each{ |issue| json.set! issue.id, issue.name }
end
но, вероятно, было бы легче подготовить хэш раньше.
json.service_issues Hash[@service.issues.map{ |issue| [ issue.id, issue.name ] }]
Ответ 2
Этот вопрос довольно старый, но для тех, кому интересно иметь хэш массивов (объектов), вы можете использовать следующий код:
@bacon_types.each do |bacon_type|
json.set! bacon_type.name, bacon_type.bacons do |bacon|
bacon.title bacon.title
...
end
Ответ 3
Вы можете сделать это так
Jbuilder.encode do |json|
json.service_issues @service.issues.inject({}) { |hash, issue| hash[issue.id] = issue.name; hash }
end
Метод хэш-генерации кода может быть понят в следующем примере.
[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"}
Ключевым моментом inject
для генерации хэша является возврат созданного хэша после ввода нового элемента. Вышеприведенный пример реализуется ; hash
; hash
.