Wie man alle Datensätze von einem verschachtelten Satz in einen echten HTML-Baum rendert

8

Ich verwende das awesome_nested_set Plugin in meinem Rails-Projekt. Ich habe zwei Modelle, die so aussehen (vereinfacht):

%Vor%

Der Baum in der Datenbank ist wie erwartet aufgebaut. Alle Werte von parent_id , lft und rgt sind korrekt. Der Baum hat mehrere Wurzelknoten (was natürlich in awesome_nested_set erlaubt ist).

Nun möchte ich alle Kategorien eines bestimmten Kunden in einer korrekt sortierten Baumstruktur darstellen: zum Beispiel verschachtelte <ul> -Tags. Dies wäre nicht zu schwierig, aber ich brauche es effizient (je weniger SQL Abfragen desto besser).

Update: Es wurde herausgefunden, dass es möglich ist, die Anzahl der Kinder für einen bestimmten Knoten in der Baumstruktur ohne weitere SQL-Abfragen zu berechnen: number_of_children = (node.rgt - node.lft - 1)/2 . Dies löst das Problem nicht, aber es kann sich als hilfreich erweisen.

    
Christoph Schiessl 03.09.2009, 09:20
quelle

7 Antworten

7

Es wäre schön, wenn verschachtelte Sets bessere Funktionen hätten, nicht wahr?

Der Trick, den Sie entdeckt haben, besteht darin, den Baum aus einem flachen Satz zu erstellen:

  • Beginnen Sie mit einer Menge aller Knoten, die nach lft
  • sortiert sind
  • der erste Knoten ist ein root, fügen Sie ihn als Wurzel des Baums zum nächsten Knoten
  • hinzu
  • Wenn es ein Kind des vorherigen Knotens (lft zwischen prev.lft und prev.rht) ist, fügen Sie ein Kind zum Baum hinzu und gehen Sie einen Knoten
  • vor
  • Bewegen Sie sich andernfalls um eine Ebene nach oben und wiederholen Sie den Test

siehe unten:

%Vor%     
John F. Miller 05.09.2009, 01:27
quelle
5

Ich habe eine ähnliche Frage beantwortet für php kürzlich (verschachtelte Menge == modifiziertes Vororderbaum-Traversalmodell).

Das Grundkonzept besteht darin, die Knoten bereits geordnet und mit einem Tiefenindikator durch eine SQL-Abfrage zu erhalten. Von dort ist es nur eine Frage des Renderns der Ausgabe über eine Schleife oder Rekursion, so dass es leicht sein sollte, dies in Ruby umzuwandeln.

Ich bin nicht vertraut mit dem awesome_nested_set Plug-in, aber es könnte bereits eine Option enthalten, um die Tiefe annotiertes, geordnetes Ergebnis zu erhalten, da es eine ziemlich normale Operation / Notwendigkeit ist, wenn verschachtelte Mengen behandelt werden.

    
Henrik Opel 03.09.2009 18:35
quelle
5

Seit September 2009 enthält das geniale verschachtelte Set eine spezielle Methode, um dies zu tun: Zypern

Diese Methode ist viel effizienter als das Aufrufen der Ebene, da keine zusätzlichen Datenbankabfragen erforderlich sind.

Beispiel: Category.each_with_level (Category.root.self_and_descendants) tue | o, level |

    
Sytse Sijbrandij 11.02.2011 15:03
quelle
3

Sie müssen einen Teil rekursiv rendern, der sich selbst aufruft. Etwas wie das:

%Vor%

Dies ist der Code von Rails 2.3. Sie müssen die Routen aufrufen und das Teil explizit vorher benennen.

    
François Beausoleil 03.09.2009 12:30
quelle
3

_tree.html.eb

%Vor%

_item.html.erb

%Vor%

Sie können auch sortieren:

%Vor%

aber in diesem Fall sollten Sie diese Zeile ENTFERNEN:

%Vor%     
Anton Orel 16.06.2010 10:38
quelle
1

Ich konnte die angenommene Antwort wegen der alten Version von Ruby, für die es geschrieben wurde, nicht annehmen. Hier ist die Lösung für mich:

%Vor%

Es wird durch die Verwendung der optionalen Tiefeninformation vereinfacht. (Vorteil dieses Ansatzes ist, dass die Eingabesatz nicht die gesamte Struktur zu den Blättern sein muss.)

Eine komplexere Lösung ohne Tiefen finden Sie auf GitHub Wiki des Edelsteins:

Ссылка

    
chyno 15.06.2014 20:16
quelle
0

Vielleicht ein bisschen spät, aber ich möchte meine Lösung für awesome_nested_set basierend auf closure_tree gem verschachtelt hash_tree Methode:

%Vor%

Dies funktioniert mit jedem Bereich, der von lft

bestellt wurde

Dann benutze Helfer, um es zu rendern:

%Vor%     
troex 13.11.2015 23:09
quelle