2009-05-15 3 views
0

Ich benutze "acts_as_nested_set" in meiner Rails App. (erweitert mit einem tollen Nested Set Plugin). Ich habe versucht, den besten Weg zum Schreiben einer Funktion/Methode zum Klonen eines Elements und seiner gesamten verschachtelten Menge zu verstehen, so dass jedes Element einen Klon erhält, aber die Beziehungsstruktur das Original nur mit den neuen Elementen nachahmt.Wie man einen gesamten verschachtelten Satz von einem Wurzelelement mit neuem Baum am besten kopiert/klont

Mit verschachtelten Sets erhalten Sie parent_id, lft, and rgt Positionssäulen ... statt nur position_id.

Sollte ich an der Unterseite (Knoten ohne Kinder) von jedem Satz beginnen und durch die Eltern bis hin zu einem neuen Stamm klonen?

Dies scheint entweder etwas, das getan wurde, oder dass es eine Methode dafür bereits für verschachtelte Sets wäre, aber ich kann nichts finden, um mich zu führen.

Danke

Antwort

1

Ich tat so etwas mit Acts-as-Tree. Ich fuhr über den Sammelsatz und klonte jeden Gegenstand. Ich habe das Quellelement und das geklonte Objekt in einem Hash gespeichert, wobei die Quelle der Schlüssel und das Klon das Ziel war. Ich habe dann den Hash zusammen mit den Elternreferenzen verwendet, um die Relationen aufzulösen und neu zu ordnen.

Hier ist ein Ausschnitt, um den Kern zu vermitteln.

Die Klonmethode instanziiert einfach eine neue Kopie ohne ID. Die Methode "descendants" gibt eine vollständige Liste der Nachkommen zurück, nicht nur die unmittelbaren Nachkommen.

def clone_branch() 
    h = {self => self.clone} #we start at the root 

    ordered = self.descendants #preserved order with acts_as_sortable 

    #clone subitems 
    ordered.each do |item| 
    h[item] = item.clone 
    end 

    #resolve relations 
    ordered.each do |item| 
    cloned = h[item] 
    item_parent = h[item.parent] 
    item_parent.children << cloned if item_parent 
    end 

    h[self] 
end 
Verwandte Themen