2010-02-09 2 views
2

J'ai essayé de trouver un bon moyen de le faire, soit du côté client en Javascript, soit à la dernière minute dans le serveur. Ceci est une application Rails mais c'est une question assez générique. J'ai un modèle hiérarchique, actuellement stocké dans un modèle de jeu imbriqué. Le modèle a alors:Algorithme de tri d'un modèle imbriqué/adjectif en Ruby

parent_id, lft, and rgt 

Je voudrais retirer tous les modèles dans une instruction select de la base de données, donc me donner une liste plate des modèles, puis les trier à la volée dans une hiérarchie d'arbre . Je n'ai pas trouvé un moyen propre de faire cela qui ne nécessite pas de récursivité. Je suis sûr qu'il existe un bon algorithme pour cela. Merci.

+0

Pourquoi ne pas utiliser la récursivité? – Ben

+0

La récursivité a des limites, nous parlons de 150 à 200 utilisateurs, avec un emboîtement assez profond. – jacortinas

Répondre

0

Je ne connais pas d'algorithme sans récursion. Je pensais partager mon assistant de vue sitemap de toute façon:

def tree_from_set(set, &node_text) 
    buf = '<ul>' 
    siblings = set.select{|n| n.parent_id == set[0].parent_id} 

    siblings.each do |node| 
    children = set.select{|n| n.lft > node.lft and n.rgt < node.rgt } 
    buf << '<li>' 
     if children.blank? 
     buf << yield(node) 
     else 
     buf << yield(node) 
     buf << tree_from_set(children, &node_text) 
     end 
    buf << '</li>' 
    end 
    buf << '</ul>' 
end