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

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

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

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

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

Спасибо

1 Ответ

1 голос
/ 29 сентября 2009

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

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

Метод 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
...