2012-04-02 15 views
13

tengo tres modelos:de anidamiento: JSON incluir en los carriles

class A < ActiveRecord::Base 
    has_many :bs 
end 

class B < ActiveRecord::Base 
    has_one :c 
    belongs_to :a 
end 

class C < ActiveRecord::Base 
    belongs_to :b 
end 

quiero conseguir datos JSON que contiene todos los B y de C a una A. He intentado varias cosas similares a:

render json: @as, :include => [:bs => [:include=>[:c]] 

pero nada funciona. ¿Cuál sería una buena manera de hacer esto?

Respuesta

30

Consulte ActiveModel::Serializers::JSON#as_json para ver las opciones que puede pasar a render :json. Para citar:

Para incluir asociaciones utilizan :include ...

segundo nivel y asociaciones de orden superior funciona así:

user.as_json(:include => { :posts => { 
          :include => { :comments => { 
              :only => :body } }, 
          :only => :title } }) 
# => { "id": 1, "name": "Konata Izumi", "age": 16, 
#  "created_at": "2006/08/01", "awesome": true, 
#  "posts": [ { "comments": [ { "body": "1st post!" }, { "body": "Second!" } ], 
#     "title": "Welcome to the weblog" }, 
#     { "comments": [ {"body": "Don't think too hard" } ], 
#     "title": "So I was thinking" } ] 
# } 

No es necesario llamar to_json o directamente as_json , como render :json lo hace automáticamente.

+1

Si está atrapado en los carriles 2, 'render() 'no admite': include', pero 'to_json()' sí. En ese caso, tiene sentido llamar 'render: json => @ as.to_json (: include =>: bs)'. –

+0

to_json veces rompen la jerarquía struct –

+0

@ Albert.Qing Si tiene un problema específico, debe publicarlo como una nueva pregunta. –

2

Trate

render :json => @as.to_json(:include => {:bs => :c}) 
5

lo necesario para pasar de hash en lugar de gama

render :json => @as.to_json(:include => { :bs => {:include =>:c} }) 
0

Prueba esto:

render json: @as.to_json(include:{bs: {include:{c:}}}) 
0

Prueba esto:

render json: @tiquets, :include => { :enterprise => {:include => { :location => {:only => :lo_name } },:only => :en_name } } } 
+0

@OwaisKureshi Una respuesta de solo código podría no ser uno bueno, pero sigue siendo una respuesta. Te recomendaría esta publicación sobre LQPRQ: [Lo estás haciendo mal: una petición de cordura en la cola de Mensajes de baja calidad] (http://meta.stackoverflow.com/questions/287563/youre-doing-it- wrong-a-declara-por-sanity-in-the-low-quality-posts-queue) – FelixSFD

+0

@FelixSFD, Bueno, estoy de acuerdo, pero debería haber algún texto explicando la respuesta, ¿o puede simplemente publicar esto como un comentario? –

+0

@OwaisKureshi Se recomienda y es preferible explicar el código un poco. Pero incluso sin explicación, esta es una respuesta. – FelixSFD

Cuestiones relacionadas