Comment mieux copier / cloner un ensemble imbriqué ensemble à partir d'un élément racine vers le bas avec nouvel arbre

StackOverflow https://stackoverflow.com/questions/866528

  •  22-08-2019
  •  | 
  •  

Question

J'utilise « acts_as_nested_set » dans mon application rails. (Étendu avec le plugin ensemble imbriqué impressionnant). Je tentais à la logique la meilleure façon d'écrire une fonction / méthode pour cloner un élément et l'ensemble de son ensemble imbriqué de telle sorte que chaque élément obtient un clone, mais la structure de la relation mimicks l'original, juste avec les nouveaux éléments.

Avec les ensembles imbriqués que vous obtenez des colonnes de position ... parent_id, lft, and rgt au lieu de simplement position_id.

Dois-je commencer par le bas (nœuds sans enfants) de chaque jeu et clone à travers les parents, tout le chemin à une nouvelle racine?

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

Merci

Était-ce utile?

La solution

Je l'ai fait quelque chose comme cela avec actes-as-arbre. J'Iterated sur l'ensemble collectif et clonées chaque élément. J'ai sauvé l'élément source et l'élément cloné dans un hachage où la source est la clé et le clone la cible. J'ai ensuite utilisé le hachage ainsi que les références des parents à résoudre et les relations remapper.

Voici un extrait pour aider à transmettre l'essentiel.

La méthode clone instancie simplement une nouvelle copie sans id. La méthode descendants retourne une liste complète des descendants non seulement ceux 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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top