2013-04-09 64 views
13

我需要产生散列的循环,而不是一个对象数组。我有这样的:产生散列的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结果手动哈希?

回答

24

这里的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 ] }] 
+0

我将如何格式的密钥为整数? – 2013-08-05 03:08:37

+2

@RichardCook你没有。 JavaScript对象键总是字符串。所以,在JavaScript myObject [2]完全等同于myObject ['2']。 – rwz 2013-08-28 07:45:57

+0

第一种方法的问题是,如果没有'@ service.issues',你不会得到一个空的散列,这个键不会出现在JSON中(以我的经验)。 – Jalada 2015-02-27 10:37:43

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实现。

2

这个问题是很老,但任何人谁是兴趣在阵列(对象)的哈希值,可以使用下面的代码:

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