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