web-dev-qa-db-ja.com

ハッシュを生成する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の結果を手動でハッシュに変換せずにこれを行うことは可能ですか?

17
Jonas

Jbuilder開発者はこちら。

簡単な答え:はい。モデルの配列をハッシュに変換せずに可能です。

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 ] }]
31
Pavel Pravosud

この質問はかなり古いものですが、配列(オブジェクト)のハッシュに関心がある人は、次のコードを使用できます。

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

あなたはこのようにそれを行うことができます

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によって実現されています。

0
yasuoza