2013-04-09 10 views
13

Potrzebuję pętli, która generuje hasz, a nie tablicę obiektów. Mam to:Pętla JBuildera, która generuje hasz

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

że wyniki:

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

muszę to:

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

Czy można to zrobić bez konwersji wynik AR hash ręcznie?

Odpowiedz

24

Deweloper Jbuilder tutaj.

Krótka odpowiedź: tak. Jest to możliwe bez konwersji tablicy modeli na hasz.

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

, ale prawdopodobnie łatwiej byłoby przygotować hasz przed rozpoczęciem.

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

Jak formatować klawiszy jako liczby całkowite ? –

+2

@RichardCook you're not. Klucze obiektów JavaScript są zawsze ciągami. Tak więc w javascript myObject [2] jest całkowicie równoważny myObject ['2']. – rwz

+0

Problem z pierwszą metodą polega na tym, że jeśli nie ma "@ service.issues", nie otrzymasz pustego hasha, klucz nie będzie obecny w JSON (na moim doświadczeniu). – Jalada

0

Można to zrobić jak ten sposób

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

Kod generowania technikę mieszania może być rozumiane przez następujący przykład.

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

Kluczowym punktem inject wygenerować hash, hash każdy zwrot stworzony po wstawieniu nowego elementu. Powyższy przykład jest realizowany przez ; hash.

2

To pytanie jest dość stary, ale dla każdego, kto jest zainteresowany posiadaniem hash tablic (obiektów), można użyć następującego kodu:

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