2010-08-11 3 views
36

Zrzeczenie się, Wiem niewiele o Railsach. Spróbuję być zwięzły. Biorąc pod uwagę następujące relacje modelu w szynach:Relacje obiektów Rails i JSON Rendering

class ModelA < ActiveRecord::Base 
    belongs_to :ModelB 

... 

class ModelB < ActiveRecord::Base 
    has_many :ModelA 

Przy wywołaniu akcji show kontrolera MODELA zwrócony JSON powinien pokazać wszystkie ObjectAs że są dziećmi objectB którego ObjectA w pytaniu jest dzieckiem.

Więc jeśli mam objectB zawierający ObjectA dnia ID 1, 2 i 3, a następnie dostęp: /modela/1.json

powinny widzę:

{ 
    "modelb": { 
    "id": "1", 
    "modela": [insert the ModelA JSON for ID's 1, 2 and 3] 
    } 
} 
+0

Czy możesz udostępnić swój kod kontrolera (szczególnie wykonywane kwerendy)? – Brian

+0

Kontroler jest ogromny. Zapytanie to po prostu @tour = Tour.find (parametry [: id]) –

+0

testtesttesttest –

Odpowiedz

100

Domyślnie you” Otrzymam tylko JSON, który reprezentuje modelb w powyższym przykładzie. Ale można powiedzieć Rails w celu włączenia innych pokrewnych przedmiotów, a także:

def export 
    @export_data = ModelA.find(params[:id]) 
    respond_to do |format| 
    format.html 
    format.json { render :json => @export_data.to_json(:include => :modelb) } 
    end 
end 

Można nawet powiedzieć to, aby wykluczyć pewne pola, jeśli nie chcesz, aby zobaczyć je w eksporcie:

render :json => @export_data.to_json(:include => { :modelb => { :except => [:created_at, updated_at]}}) 

Albo to tylko niektóre pola:

render :json => @export_data.to_json(:include => { :modelb => { :only => :name }}) 

I można zagnieździć te, jak głęboko, jak trzeba (powiedzmy, że ModelB również hAS_MANY ModelC):

render :json => @export_data.to_json(:include => { :modelb => { :include => :modelc }}) 

Jeśli chcesz zawierać wiele skojarzeń modelowe dziecko, można wykonać następujące czynności:

render :json => @export_data.to_json(include: [:modelA, :modelB, :modelN...]) 
+4

Jeśli chcesz więcej niż jeden dodać, dodaj jako tablicę: '@ whatever.to_json (include: [: modelA,: modelB,: modelN ...]) '. – Automatico

+0

Jeśli chciałbym wywołać tę funkcję eksportu w widoku, aby pobrać atrybuty z określonego modelu, jak nazwałbym to? – Scalahansolo

0

Jeśli chcesz bardziej elastyczne podejście do renderowania json, można rozważyć użycie JBuilder GEM: https://github.com/rails/jbuilder

Umożliwia renderowanie niestandardowych atrybutów, zmiennych instancji, asocjacji, ponowne wykorzystanie części json w wygodny sposób.