我需要生成散列的循环,而不是对象数组。我有这个:
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结果手动转换为哈希的情况下执行此操作?
答案 0 :(得分:29)
Jbuilder dev here。
简短回答:是的。没有将模型数组转换为哈希值,这是可能的。
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 ] }]
答案 1 :(得分:2)
这个问题已经很老了,但是对于有兴趣拥有数组(对象)哈希的人,可以使用以下代码:
@bacon_types.each do |bacon_type|
json.set! bacon_type.name, bacon_type.bacons do |bacon|
bacon.title bacon.title
...
end
答案 2 :(得分:0)
你可以这样做
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
实现。