2013-04-09 96 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