2012-04-02 15 views
13

Ho tre modelli:Nesting: JSON includere in Rails

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 

voglio ottenere dati JSON contenente tutte B e C di un A. Ho provato un certo numero di cose simili a:

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

ma niente funziona. Quale sarebbe un buon modo per farlo.

risposta

30

Consultare ActiveModel::Serializers::JSON#as_json per vedere le opzioni è possibile passare a render :json. Per citare:

Per includere le associazioni utilizzano :include ...

secondo livello e le associazioni di ordine superiore funzionare così:

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" } ] 
# } 

Non è necessario chiamare o to_jsonas_json direttamente , come render :json lo fa automaticamente.

+1

Se sei bloccato in Rails 2, 'render() 'non supporta': include', ma 'to_json()' fa. In tal caso, ha senso chiamare 'render: json => @ as.to_json (: include =>: bs)'. –

+0

to_json a volte interrompe la struttura del nido –

+0

@ Albert.Qing Se si verifica un problema specifico, pubblicarlo come una nuova domanda. –

2

Prova

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

è necessario passare in hash invece di serie

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

Prova questo:

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

Prova questo:

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

@OwaisKureshi Una risposta solo in codice potrebbe non essere una buona, ma è ancora una risposta. Ti consiglierei questo post sul LQPRQ: [Stai sbagliando: una richiesta di sanità mentale nella coda Messaggi di bassa qualità] (http://meta.stackoverflow.com/questions/287563/youre-doing-it- sbagliato-a-plea-for-sanity-in-the-low-quality-posts-queue) – FelixSFD

+0

@FelixSFD, beh, sono d'accordo, ma ci dovrebbe essere del testo che spiega la risposta, o può semplicemente postare questo come un commento? –

+0

@OwaisKureshi È consigliabile e preferibile spiegare un po 'il codice. Ma anche senza spiegazione, questa è una risposta. – FelixSFD