1

我在我的 Rails 应用程序中使用“acts_as_nested_set”。(扩展了很棒的嵌套集插件)。我试图找出最好的方法来编写一个函数/方法来克隆一个元素及其整个嵌套集,以便每个元素都得到一个克隆,但关系结构模仿原始元素,只是使用新元素。

使用嵌套集,您可以获得parent_id, lft, and rgt位置列...而不仅仅是position_id.

我应该从每组的底部(没有孩子的节点)开始,然后通过父母一直克隆到新的根吗?

这似乎是已经完成的事情,或者已经有一种方法可以为嵌套集执行此操作,但我找不到任何可以指导我的东西。

谢谢

4

1 回答 1

2

我用acts-as-tree做了这样的事情。我迭代了集合集并克隆了每个项目。我将源项目和克隆项目保存在哈希中,其中源是键,克隆是目标。然后我使用散列和父引用来解析和重新映射关系。

这是一个有助于传达要点的片段。

clone 方法只是简单地实例化一个没有 id 的新副本。descendants 方法返回一个完整的后代列表,而不仅仅是直接的后代。

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
于 2009-09-29T19:07:59.877 回答