2012-02-24 23 views
5

Estoy usando la gema RABL para representar datos de usuario JSON para los usuarios de comentarios que son hijos de anotaciones que son hijos de imágenes. Me gustaría hacer algo similar a:Rails 3.1 anidamiento profundo 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 

Sé que esto no es válido en RABL, también probé utilización de niños en lugar de nodo, pero no podía acceder a los datos de usuario de esa manera. ¿Cómo debo hacer esto y cuál es la sintaxis adecuada para que esto suceda?

Respuesta

8

Recibí esta respuesta de @calvin-l. El truco fue simplemente asignar los a.comments luego tomar los datos de cada comentario de esa manera:

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. esta forma de crear un hash en un bloque guarda un par de líneas pero es algo confuso (y unidiomático). Estaba a punto de actualizarlo, pero bueno, supongo que no es tan malo después de todo. – tokland