2013-04-09 20 views
13

オブジェクトの配列ではなく、ハッシュを生成するループが必要です。私はこれを持っている:ハッシュを生成するJBuilderループ

service_issues: { 
    3: "Not delivered", 
    6: "Broken item", 
    1: "Bad color", 
    41: "Delivery problem" 
} 

それは手動でハッシュするARの結果を変換せずにこれを行うことは可能です:

service_issues: [ 
    { 
    3: "Not delivered" 
    }, 
    { 
    6: "Broken item" 
    }, 
    { 
    1: "Bad color" 
    }, 
    { 
    41: "Delivery problem" 
    } 
] 

が、私はこれを必要とする:結果

json.service_issues @service.issues do |issue| 
    json.set! issue.id, issue.name 
end 

答えて

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

どのように私は整数としてキーをフォーマットします? –

+2

@リチャードクックはしていません。 Javascriptのオブジェクトキーは常に文字列です。したがって、javascriptのmyObject [2]はmyObject ['2']と完全に同じです。 – rwz

+0

最初のメソッドの問題は、 '@ service.issues'がなければ、空のハッシュを取得しないことです。私の経験上、このキーはJSONには存在しません。 – Jalada

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