2009-05-15 6 views
0

J'utilise "acts_as_nested_set" dans mon application rails. (étendu avec génial plugin ensemble imbriqué). J'essayais de trouver la meilleure façon d'écrire une fonction/méthode pour cloner un élément et tout son ensemble imbriqué afin que chaque élément obtienne un clone mais la structure de la relation mime l'original, juste avec les nouveaux éléments.Comment copier/cloner au mieux un ensemble imbriqué entier à partir d'un élément racine avec un nouvel arbre

Avec les ensembles imbriqués, vous obtenez parent_id, lft, and rgt colonnes positionnelles ... au lieu de seulement position_id.

Dois-je commencer par le bas (nœuds sans enfants) de chaque ensemble et cloner les parents jusqu'à une nouvelle racine?

Cela semble être quelque chose qui a été fait ou qu'il y aurait une méthode pour le faire déjà pour les ensembles imbriqués, mais je ne vois pas de quoi me guider.

Merci

Répondre

1

je l'ai fait quelque chose comme cela avec actes-as-arbre. J'ai parcouru l'ensemble collectif et cloné chaque objet. J'ai sauvegardé l'élément source et l'élément cloné dans un hachage où la source était la clé et le clone la cible. J'ai ensuite utilisé le hachage avec les références parent pour résoudre et remapper les relations.

Voici un extrait pour aider à transmettre l'essentiel.

La méthode clone instancie simplement une nouvelle copie sans identifiant. La méthode descendants renvoie une liste complète des descendants et pas seulement des descendants immédiats.

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 
Questions connexes