删除父节点但不删除具有awesome_nested_set的子节点?

时间:2011-05-12 09:40:29

标签: mysql ruby-on-rails ruby database

删除父节点但不删除子节点。

子节点应全部移动到已删除父节点的级别。

如何使用awesome_nested_set插件处理此方案?

修改

在删除子项之前

Id,Title,lft,rgt,parent_id

1,root,7,12,nil

2,孩子,8,11,1

3,子孩,9,10,2

删除2条记录后

Id,Title,lft,rgt,parent_id

1,root,7,12,nil

3,子孩,9,10,1,

我想将子子移动到已删除对象的直接父级。这是一个正确的结果吗?或者lft和rgt应该在删除后更改?

2 个答案:

答案 0 :(得分:1)

某种形式:

  • 查找已删除节点的父级
  • 将所有孩子移至新父母

实施例

@node = Node.find(params[:id])
@children = @node.children
@parent = @node.parent
@children.each{ |child| child.move_to_child_of @parent }

答案 1 :(得分:1)

控制器

  @node = Node.find(params[:id])
  @node.delete_node_keep_sub_nodes
  @node.reload
  @node.destroy

模型

  def delete_node_keep_sub_nodes
    if self.child?
      self.move_children_to_immediate_parent
    else
      self.move_children_to_root
    end
  end

  def move_children_to_immediate_parent
    node_immediate_children = self.children
    node_immediate_parent = self.parent
    node_immediate_children.each do |child|
      child.move_to_child_of(node_immediate_parent)
      node_immediate_parent.reload
    end
  end

  def move_children_to_root
    node_immediate_children = self.children
    node_immediate_children.each do |child|
      child.move_to_root
      child.reload
    end
  end