web-dev-qa-db-fra.com

Relations d'objet Rails et rendu JSON

Déni de responsabilité, je connais très peu de choses sur Rails. Je vais essayer d'être bref . Étant donné les relations de modèle suivantes dans Rails:

class ModelA < ActiveRecord::Base
  belongs_to :ModelB

...

class ModelB < ActiveRecord::Base
    has_many :ModelA

Lors de l'appel de l'action show du contrôleur ModelA, le JSON renvoyé doit afficher tous les ObjectA qui sont des enfants de l'ObjectB dont ObjectA en question est un enfant.

Donc, si j'ai un ObjectB qui contient les ObjectA des ID 1, 2 et 3 puis accédez à: /modela/1.json

Je devrais voir:

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

Par défaut, vous obtenez uniquement le JSON qui représente modelb dans votre exemple ci-dessus. Cependant, vous pouvez indiquer à Rails d'inclure également les autres objets associés:

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

Vous pouvez même lui dire d'exclure certains champs si vous ne voulez pas les voir dans l'exportation:

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

Ou, n'incluez que certains champs:

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

Et vous pouvez imbriquer ceux-ci aussi profondément que nécessaire (disons que ModelB a aussi beaucoup de ModelC):

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

Si vous souhaitez inclure plusieurs associations de modèles enfants, vous pouvez effectuer les opérations suivantes:

render :json => @export_data.to_json(include: [:modelA, :modelB, :modelN...])
106
Rob Cameron

Si vous souhaitez une approche plus souple du rendu de JSON, vous pouvez utiliser le gem jbuilder: https://github.com/Rails/jbuilder

Il vous permet de rendre des attributs personnalisés, des variables d'instance, des associations et de réutiliser des partiels json de manière pratique.

0