2010-12-14 15 views
19

Ho una situazione di modello di dati strano con cui iniziare, quindi forse il mio intero approccio è sbagliato. Ecco cosa sto facendo:RoR nidificato: includi includere le risorse secondarie in to_xml/to_json

Ho una classe chiamata Bird e una classe semplice chiamata Colore. Concettualmente, ogni uccello ha due o più associazioni a Colore, una per i colori maschili e una per i colori femminili. Il modo in cui ho gestito questo è di usare un modello di join chiamato BirdColoration che appartiene a un uccello e un colore e ha un campo booleano aggiuntivo per dire se la colorazione è per maschio o femmina. Quindi ogni uccello ha in realtà una relazione con molte persone con BirdColoration e con un grande numero di colori: attraverso BirdColoration. Se sembra ragionevole, continua a leggere. Altrimenti, fermati e dimmi perché è sbagliato!

Devo essere in grado di scaricare il tavolo degli uccelli come JSON. In precedenza, quando ogni uccello aveva solo una o più associazioni ai colori, potevo semplicemente usare: includi includere i colori di ogni uccello nella discarica JSON. Ora, sto includendo le colorazioni Bird nella discarica, ma ho ancora bisogno di ottenere i modelli di colore stessi. Potrei includere separatamente i colori e le colorazioni di ciascun uccello e poi abbinarli mentre sto analizzando, ma preferirei semplicemente includere solo il colore di ogni colorazione direttamente. Qualcosa come

 format.json { render :json => @birds.to_json(:include => [{:bird_colorations => :color}, :seasons, :habitats, :image_holders]) } 

Quanto sopra non funziona, tuttavia. Penso che questo dovrebbe essere possibile. Qualcuno può indicarmi la giusta direzione su come gestirlo?

Per ora, includerò solo i colori e le colorazioni di ciascun uccello separatamente e li abbinerò durante l'analisi. Almeno so che funzionerà.

Grazie!

risposta

51

Ho trovato la risposta here. La sintassi per l'opzione: include in to_xml e to_json è diversa da quella per il metodo di ricerca di ActiveRecord. Per includere le risorse nidificate in questo modo, si passa un hash anziché un array. Il metodo corretto per chiamarmi assomiglia a:

 format.json { render :json => @birds.to_json(:include => {:bird_colorations => {:include => :color}, :seasons => {}, :habitats => {}, :image_holders => {}}) } 

Confronta a quello nella mia domanda per vedere la differenza. Per le risorse per le quali non si desidera includere le risorse secondarie, basta passare un hash vuoto come valore per il suo nome simbolizzato.

Vivi e impara!

+1

Mi piacerebbe votare di più per questo !! Grazie! – brutuscat

+0

anche io @brutuscat. Salvato il mio bacon! – Rots

+0

Il codice nella tua domanda sembra molto più pulito, questo è così poco intuitivo. Soprattutto perché se non avessi il colore di nidificazione bird_colorations, l'esempio delle domande funzionerebbe. Grazie per aver postato la tua soluzione. Rails dovrebbe risolvere questo ... – thatmiddleway

2

Se si dispone di una struttura JSON complessa, è preferibile sostituire il modello serializable_hash o as_json nel modello piuttosto che provare a eseguire tutto tramite render :json.

Quindi qualcosa di simile

def serializable_hash(options = nil) 
    options ||= {} 
    bird = {:name => name, ...} 
    bird[:seasons] = seasons.serilizable_hash 
    bird[:colors] = ... # whatever complex logic you want to get to the colors 
    bird 
end 

Entrambe le funzioni solo bisogno di restituire un hash.

+0

Grazie! Daro un'occhiata a questo. Se sono soddisfatto dell'output che sto ottenendo dal render: json, c'è qualche altra ragione per scavalcare quei metodi (performance, forse)? A parità di condizioni, il mio istinto è di lasciare che la funzionalità integrata si prenda cura delle cose per me. – CharlieMezak

+0

Non penso che otterrete un aumento delle prestazioni perché il rendering json chiama as_json/serializable_hash in background.È solo una buona filosofia di design chiamata "modelli grassi, controller sottili", più elegantemente discussi qui: http://stackoverflow.com/questions/2550376/rails-skinny-controller-vs-fat-model-or-should-i- make-my-Controller-anoressica – icecream

Problemi correlati