2012-04-02 16 views
13

mam trzy modele:zagnieżdżanie: json obejmują w 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 

Chcę dostać zawierające dane json wszystko B i C o wydanie A. Próbowałem wiele rzeczy podobnych do:

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

ale nic nie działa. Jaki byłby dobry sposób na zrobienie tego.

Odpowiedz

30

Patrz ActiveModel::Serializers::JSON#as_json aby zobaczyć opcje można przekazać render :json. Zacytować:

należą do stowarzyszenia używać :include ...

Drugi poziom i wyższe stowarzyszenia zlecenia, a także:

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

Nie trzeba zadzwonić to_json bezpośrednio lub as_json , jako render :json robi to automatycznie.

+1

Jeśli utkniesz w Rails 2, 'renderowanie() 'nie obsługuje': include', ale 'to_json()' robi. W takim przypadku warto wywołać 'render: json => @ as.to_json (: include =>: bs)'. –

+0

to_json czasami łamie strukturę gniazd –

+0

@ Albert.Qing Jeśli masz konkretny problem, powinieneś opublikować go jako nowe pytanie. –

2

Spróbuj

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

Trzeba zdać w hash zamiast tablicy

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

Spróbuj tego:

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

Spróbuj tego:

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

@OwaisKureshi Odpowiedź tylko kodu może nie być dobry, ale wciąż jest odpowiedzią. Poleciłbym ci ten post o LQPRQ: [Robisz to źle: prośba o zdrowie psychiczne w kolejce postów o niskiej jakości] (http://meta.stackoverflow.com/questions/287563/youre-doing-it- źle-za-za-sanity-w-niskiej jakości-posty-kolejki) – FelixSFD

+0

@FelixSFD, Cóż, zgadzam się, ale powinien być jakiś tekst wyjaśniający odpowiedź, czy może po prostu opublikować to jako komentarz? –

+0

@OwaisKureshi Zaleca się i lepiej jest wyjaśnić nieco kod. Ale nawet bez wyjaśnienia, jest to odpowiedź. – FelixSFD