Как лучше всего скопировать/клонировать весь вложенный набор из корневого элемента вниз с новым деревом

Я использую «acts_as_nested_set» в своем приложении rails. (расширен с помощью плагина awesome вложенных наборов). Я пытался найти лучший способ написать функцию/метод для клонирования элемента и всего его вложенного набора, чтобы каждый элемент получал клон, но структура отношений имитировала оригинал, только с новыми элементами.

С вложенными наборами вы получаете parent_id, lft, and rgt позиционных столбца... вместо position_id.

Должен ли я начинать снизу (узлы без дочерних элементов) каждого набора и клонировать родительские узлы вплоть до нового корня?

Это похоже либо на что-то, что было сделано, либо на то, что для вложенных наборов уже есть метод, но я не вижу, чтобы найти что-то, что могло бы мне помочь.

Спасибо


person Streamline    schedule 15.05.2009    source источник


Ответы (1)


Я сделал что-то подобное с act-as-tree. Я перебрал коллективный набор и клонировал каждый элемент. Я сохранил исходный элемент и клонированный элемент в хеше, где источником был ключ, а клоном — цель. Затем я использовал хэш вместе с родительскими ссылками для разрешения и переназначения отношений.

Вот фрагмент, который поможет передать суть.

Метод clone просто создает новую копию без идентификатора. Метод потомков возвращает полный список потомков, а не только непосредственных.

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
person Mario    schedule 29.09.2009