2010-09-23 8 views
2

j'ai un modèle comme celui-cirails to_json un comportement inattendu pour include_root_in_json

class Parent < ActiveRecord::Base 
    :has_many :kids 
end 

class Kid < ActiveRecord::Base 
    :has_many :grandkids 
    :belongs_to :parent 
end 

je peux générer JSON comme ceci:

the_parent.to_json(:methods => [:kids]) 

=>{ "parent": { "enfants": [ {"kid": {"name" => "kid0" .... et ainsi de suite. Juste ce que je veux. Chaque objet ressemble à un hachage avec une seule clé - qui est le nom du modèle - et la valeur est un hachage d'attribut. Génial.

Mais je reçois des ennuis lorsque je tente de sérialiser l'arbre entier, comme ceci:

the_parent.to_json(:include => { :kids => { :include => :grandkids } }) 

=>{ "parent": { "enfants": [{ "name" => « kid0 " ... qui manque les noms de modèles dans le tableau" enfants ". La même chose arrive au niveau suivant avec les petits-enfants. Je vais analyser cela ailleurs, et cela aiderait à avoir une certitude sur le nom de l'objet (au lieu de s'appuyer sur la convention en utilisant le nom de la relation). Les docs annoncent ceci:

ActiveRecord::Base.include_root_in_json = true 

qui je l'ai trouvé aucun effet. Ma conjecture est que le comportement différent a quelque chose à voir avec la différence entre la méthode: et les options d'inclusion, mais je ne peux pas bidouiller la syntaxe: pour obtenir l'imbrication dont j'ai besoin, et je ne suis pas sûr que cela fonctionne si elle compile.

Des idées? Merci, Dan

+0

, je fais l'appel to_json dans le contexte d'un rendu: format. json {render: json => the_parent.to_json ... – danh

+0

Je suis sûr qu'il y a une meilleure réponse, mais comme solution de contournement, je surcharge to_json dans mon modèle comme ceci: def to_json (args) super (: methods => [: kids]) end – danh

Répondre

1

Pour contourner ce problème, je suis remplaçant to_json dans mon modèle comme celui-ci:

J'ai aussi mentionné
def to_json(args) 
    super(:methods => [:kids]) 
end 
+0

Cela fonctionne, mais cela entraîne de mauvaises performances si vous traitez beaucoup de données. : include est beaucoup plus rapide! – Alexander

Questions connexes