2010-04-20 3 views
0

Bonjour: Est-ce que quelqu'un a une solution pour convertir un modèle acts_as_tree en json qui inclut tous ses nœuds? J'ai truqué en utilisant: include =>: children, mais cela ne descend qu'à un seul niveau. Une idée de comment itérer l'arbre entier?acts_as_tree et to_json or from_json

Répondre

0

Utilisez une aide (ou une méthode privée) qui est récursive et transforme vos modèles imbriqués en un hachage imbriqué, puis utilisez to_json pour générer une chaîne json. J'ai eu besoin de générer Json dans une vue HTML/Erb, mais la même idée devrait s'appliquer si vous devez le générer à partir d'une action du contrôleur, ou utiliser un modèle Erb pour générer Json. J'avais aussi besoin d'un noeud racine (codé en dur), vous pouvez l'ignorer si ce n'est pas nécessaire.

categories.html.erb

<script type="text/javascript"> 
    $(function(){ 
     var json = { 
     id: "node00", 
     name: "New Pathway", 
     data: {}, 
     children: 
<%= @categories.select { |c| c.root? && !c.leaf? }.collect { |c| category_to_spacetree_json(c) }.to_json.html_safe %> 
     }; 

     init(json); 
    }); 
</script> 

categories_helper.rb

def category_to_spacetree_json(category) 
    hash = { 
     :id => category.id, 
     :name => category.name, 
     :data => '', 
     :children => [] 
    } 

    unless category.leaf? 
     hash[:children] = category.children.public.collect { |c| category_to_spacetree_json(c) } 
    end 

    hash   
    end 
0

Vous pouvez écrire votre propre méthode qui renvoie tous les descendants, mais il s'agit de l'un de ces cas où le type d'arborescence que vous utilisez sera plutôt inefficace. Si vous êtes préoccupé par les performances et les accès à la base de données, vous devriez regarder dans l'un des gems set imbriqués, ou les ancestry gem qui sont des moyens beaucoup plus efficaces pour récupérer des branches d'arbre.