rails query postgres example ruby-on-rails ruby json activerecord

ruby-on-rails - query - rails postgresql



Rails Relaciones de objetos y representación JSON (2)

Por defecto, solo obtendrá el JSON que representa el modelb en su ejemplo anterior. Pero, puedes decirle a Rails que incluya también otros objetos relacionados:

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 puede indicarle que excluya ciertos campos si no desea verlos en la exportación:

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

O bien, incluya solo ciertos campos:

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

Y puede anidarlos tan profundamente como necesite (digamos que el Modelo B también tiene_muy ModeloC):

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...])

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

class ModelA < ActiveRecord::Base belongs_to :ModelB ... class ModelB < ActiveRecord::Base has_many :ModelA

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

Entonces, si tengo un ObjectB que contiene ObjectA''s de ID 1, 2 y 3 y luego acceso a /modela/1.json

Debería ver:

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


Si desea un enfoque más flexible para renderizar json, puede considerar usar el jbuilder de gemas: https://github.com/rails/jbuilder

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