En ce moment j'ai cette ligne:
render json: @programs, :except => [:created_at, :updated_at]
Cependant, comme un programme appartient à une entreprise, j'aimerais afficher le nom de l'entreprise au lieu de l'identifiant de l'entreprise.
Comment puis-je inclure le nom de la société lors du rendu des programmes?
Quelque chose comme ça devrait marcher:
render :json => @programs, :include => {:insurer => {:only => :name}}, :except => [:created_at, :updated_at]
je commençais à recevoir la même erreur "impossible de cloner le fichier de symboles" lors du rendu de JSON avec une méthode de contrôleur évité comme ça:
render :json => @list.to_json( :include => [:tasks] )
Pensez à utiliser jbuilder pour inclure des modèles imbriqués de manière maintenable:
# /views/shops/index.json.jbuilder
json.shops @shops do |shop|
# shop attributes to json
json.id shop.id
json.address shop.address
# Nested products
json.products shop.products do |product|
json.name product.name
json.price product.price
end
end
Vous pouvez également le faire au niveau du modèle.
programme.rb
def as_json(options={})
super(:except => [:created_at, :updated_at]
:include => {
:company => {:only => [:name]}
}
)
end
end
Maintenant dans votre contrôleur:
render json: @programs
Essaye ça. Réf
#`includes` caches all the companies for each program (eager loading)
programs = Program.includes(:company)
#`.as_json` creates a hash containing all programs
#`include` adds a key `company` to each program
#and sets the value as an array of the program's companies
#Note: you can exclude certain fields with `only` or `except`
render json: programs.as_json(include: :company, only: [:name])
En outre, inutile de faire de @programs
une variable d'instance, car je suppose que nous ne la transmettons pas à une vue.
#includes is used to avoid n+1 query.
# http://guides.rubyonrails.org/active_record_querying.html#eager-loading-associations
Here is an example for the above example.Lets say you have posts and each post has many comments to it.
@posts = Post.where('id IN [1,2,3,4]').includes(:comments)
respond_to do |format|
format.json {render json: @posts.to_json(:include => [:comments]) }
end
#output data
[
{id:1,name:"post1",comments:{user_id:1,message:"Nice"}}
{id:2,name:"post2",comments:{user_id:2,message:"okok"}}
{id:3,name:"post1",comments:{user_id:12,message:"great"}}
{id:4,name:"post1",comments:{user_id:45,message:"good enough"}}
]