Relaciones de objetos Rails y renderizado JSON

Resuelto M. Ryan asked hace 14 años • 2 respuestas

Descargo de responsabilidad, sé muy poco sobre Rails. Intentaré ser conciso. Dadas las siguientes relaciones modelo en Rails:

class ModelA < ActiveRecord::Base
  belongs_to :ModelB

...

class ModelB < ActiveRecord::Base
    has_many :ModelA

Al llamar a la acción show del controlador ModelA, el JSON devuelto debe mostrar todos los ObjectA que son hijos del ObjectB del cual el ObjectA en cuestión es hijo.

Entonces, si tengo un ObjectB que contiene los ObjectA de ID 1, 2 y 3 y luego accedo a: /modela/1.json

Debería ver:

{
  "modelb": {
    "id": "1",
    "modela": [insert the ModelA JSON for ID's 1, 2 and 3]
  }
}
M. Ryan avatar Aug 12 '10 03:08 M. Ryan
Aceptado

De forma predeterminada, solo obtendrá el JSON que representa modelben el ejemplo anterior. Pero puedes decirle a Rails que incluya otros objetos relacionados también:

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

Incluso puedes decirle que excluya ciertos campos si no quieres verlos en la exportación:

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

O incluya solo ciertos campos:

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

Y puedes anidarlos tan profundamente como necesites (digamos que ModelB también tiene_many ModelC):

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

Si desea incluir varias asociaciones de modelos secundarios, puede hacer lo siguiente:

render :json => @export_data.to_json(include: [:modelA, :modelB, :modelN...])
Rob Cameron avatar Aug 11 '2010 21:08 Rob Cameron

Si desea un enfoque más flexible para representar json, puede considerar usar la gema jbuilder: https://github.com/rails/jbuilder

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

Châu Hồng Lĩnh avatar Jun 01 '2016 19:06 Châu Hồng Lĩnh