2012-02-24 19 views
5

Sto usando la gemma RABL per rendere i dati utente JSON per gli utenti di commenti che sono figli di annotazioni che sono figli di immagini. Mi piacerebbe fare qualcosa di simile a:Rails 3.1 nidificazione profonda con RABL

object @image 

node :annotations do 
    @image.annotations.map { |a| { 
    :id => a.id, 
    :x1 => a.x1, 
    :x2 => a.x2, 
    :y1 => a.y1, 
    :y2 => a.y2, 
    node :comments do 
     @image.annotations.comments.map { |c| { 
     :body => c.body, 
     :user_id => c.user_id, 
     :name => User.find(c.user_id).name, 
     :user_icon => user_icon(User.find(c.user_id), 'square', 30) 
     }} 
    end 
    }} 
end 

So che questo non è valido per Rabl, ho anche provato ad utilizzare bambino al posto del nodo, ma non poteva accedere ai dati degli utenti in questo modo. Come dovrei andare a fare questo e qual è la sintassi corretta per farlo accadere?

risposta

8

Ho ricevuto questa risposta dal @calvin-l. Il trucco consisteva semplicemente nel mappare gli a.comments e quindi prendere i dati da ciascun commento in questo modo:

node :annotations do 
    @image.annotations.map { |a| { 
    :id => a.id, 
    :x1 => a.x1, 
    :x2 => a.x2, 
    :y1 => a.y1, 
    :y2 => a.y2, 
    :comments => a.comments.map { |c| { 
     :body => c.body, 
     :created_at => c.created_at, 
     :user => { 
     :id => c.user.id, 
     :facebook_id => c.user.facebook_id, 
     :name => c.user.name, 
     :username => c.user.username 
     } 
    }} 
    }} 
end 
+0

+1. questo modo di creare un hash in un blocco salva un paio di righe ma è un po 'confuso (e unidiomatico). Stavo per aggiornarlo, ma, immagino, dopotutto non è poi così male. – tokland