2013-04-09 7 views
13

Ich brauche Schleife, die Hash erzeugt, nicht ein Array von Objekten. Ich habe dies:JBuilder-Schleife, die Hash erzeugt

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

, dass die Ergebnisse:

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

Ich brauche dies:

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

Ist es möglich, dies zu tun, ohne AR Ergebnis Umwandlung manuell Hash?

Antwort

24

Jbuilder Entwickler hier.

Kurze Antwort: Ja. Es ist möglich, ohne Array von Modellen in Hash zu konvertieren.

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

aber es wäre wahrscheinlich einfacher, Hash-Vorhand vorzubereiten.

json.service_issues Hash[@service.issues.map{ |issue| [ issue.id, issue.name ] }] 
+0

Wie würde ich den Schlüssel als ganze Zahlen formatiert ? –

+2

@RichardCook Sie nicht. Javascript-Objektschlüssel sind immer Zeichenfolgen. Also, in Javascript ist myObject [2] vollständig äquivalent zu myObject ['2']. – rwz

+0

Das Problem mit der ersten Methode ist, dass, wenn es keine '@ service.issues' gibt, Sie keinen leeren Hash erhalten werden, der Schlüssel wird nicht in der JSON vorhanden sein (meiner Erfahrung nach). – Jalada

0

Sie können es wie auf diese Weise tun

Jbuilder.encode do |json| 
    json.service_issues @service.issues.inject({}) { |hash, issue| hash[issue.id] = issue.name; hash } 
end 

Der Code Hash-Technik zu erzeugen, indem folgende Beispiel verstanden werden kann.

[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"} 

Der Schlüsselpunkt inject Hash zu erzeugen, return erzeugt Hash jedes neue Element nach dem Einsetzen. Obiges Beispiel wird durch ; hash realisiert.

2

Diese Frage ist ziemlich alt, aber für jeden, der in mit einem Hash von Arrays (Objekten) interessiert ist, können Sie den folgenden Code verwenden:

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