2012-04-02 12 views
13

Ich habe drei Modelle:Nesting: json sind in Rails

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

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 

I json Daten enthält alle B und C ist für ein A. Ich habe versucht, eine Reihe von Dingen ähnlich zu bekommen

aber nichts funktioniert. Was wäre ein guter Weg, dies zu tun.

Antwort

30

zu ActiveModel::Serializers::JSON#as_json Siehe die Optionen zu sehen, zu render :json passieren kann. Zu zitieren:

schließen Verbände :include verwenden ...

Zweite Ebene und höherer Ordnung Verbände arbeiten auch:

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

Es ist nicht notwendig to_json oder as_json direkt anzurufen , wie render :json tut es automatisch.

+1

Wenn Sie in Rails stecken 2, 'zu machen() '' unterstützt nicht ': include', aber' to_json() 'tut das. In diesem Fall ist es sinnvoll, 'render: json => @ as.to_json (: include =>: bs)' aufzurufen. –

+0

to_json manchmal brechen die Nest-Struktur –

+0

@ Albert.Qing Wenn Sie ein bestimmtes Problem haben, sollten Sie es als eine neue Frage veröffentlichen. –

2

Versuchen

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

Sie benötigen anstelle von Array in Hash passieren

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

Try this:

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

Versuchen Sie folgendes:

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

@OwaisKureshi Eine Code-only-Antwort möglicherweise nicht ein guter, aber es ist immer noch eine Antwort. Ich würde dir diesen Artikel über das LQPRQ empfehlen: [Du machst es falsch: Ein Plädoyer für Vernunft in der Warteschlange für minderwertige Posts] (http://meta.stackoverflow.com/questions/287563/youre-doing-it- Falsch-ein-Plädoyer für Vernunft-in-der-Qualität-Postsqueue) – FelixSFD

+0

@FelixSFD, Nun, ich stimme zu, aber es sollte ein Text sein, der die Antwort erklärt, oder er kann das einfach als Kommentar posten? –

+0

@OwaisKureshi Es wird empfohlen und vorzuziehen, den Code ein wenig zu erklären. Aber auch ohne Erklärung ist dies eine Antwort. – FelixSFD