2010-08-11 18 views
36

Descargo de responsabilidad, sé muy poco acerca de Rails. Trataré de ser conciso. Dadas las siguientes relaciones de modelo en rieles:Rails Relaciones con objetos y JSON Rendering

class ModelA < ActiveRecord::Base 
    belongs_to :ModelB 

... 

class ModelB < ActiveRecord::Base 
    has_many :ModelA 

Cuando se llama a la acción show del controlador ModelA el JSON devuelto debe mostrar todos los ObjectAs que son hijos de la ObjectB de los cuales el Objecta en cuestión es un hijo de.

Así que si tengo una ObjectB que contiene de Objecta de ID 1, 2 y 3 y luego el acceso: /modela/1.json

que debería ver:

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

¿Puedes compartir el código de tu controlador (especialmente la consulta que se realiza)? – Brian

+0

El controlador es enorme. La consulta es solo @tour = Tour.find (params [: id]) –

+0

testtesttesttest –

Respuesta

100

Por defecto' Solo obtendré el JSON que representa modelb en su ejemplo anterior. Sin embargo, se puede decir rieles para incluir los otros objetos relacionados, así:

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 

También puede decir que para excluir ciertos campos si no quiere verlos en la exportación:

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

O, solamente a determinados campos:

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

Y puede anidar los tan profundamente como sea necesario (digamos que ModelB también has_many ModelC): 012

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

Si desea incluir múltiples asociaciones modelo hijo, puede hacer lo siguiente:

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

Si desea incluir más de uno, agregue el como una matriz: '@ whatever.to_json (incluya: [: modeloA,: modeloB,: modeloN ...]) '. – Automatico

+0

Si quisiera llamar a esta función de exportación dentro de una vista para extraer atributos de un modelo específico, ¿cómo podría llamar esto? – Scalahansolo

0

Si desea un enfoque más flexible para la representación JSON, se puede considerar el uso de la JBuilder joya: https://github.com/rails/jbuilder

Le permite representar atributos personalizados, variables de instancia, asociaciones, reutilizar json parciales de manera conveniente.