删除孤儿父母

ghe*_*ton 11 ruby activerecord ruby-on-rails

我有这样的关系:

Parent
  has_many :children

Child
  belongs_to :parent
Run Code Online (Sandbox Code Playgroud)

我想要做的是删除父母,如果没有更多的孩子.所以要做到这一点我有:

Child
    before_destroy :destroy_orphaned_parent

    def destroy_orphaned_parent
      parent.children.each do |c|
        return if c != self
      end
      parent.destroy
    end
Run Code Online (Sandbox Code Playgroud)

这工作正常,但我想将父级的删除级联到子级.我通常会这样做:

Parent
  has_many :children, :dependent => :destroy
Run Code Online (Sandbox Code Playgroud)

这会导致WebRick服务器在测试时崩溃.我假设这是由于最后一个孩子的无限循环删除父母删除孩子等.

我开始认为有更好的方法可以做到这一点?有人有主意吗?有没有办法阻止这种递归?

Abr*_*ram 8

我通过以下方式完成了这项工作:

  before_destroy :find_parent
  after_destroy :destroy_orphaned_parent

  def find_parent
    @parent = self.parent
  end

  def destroy_orphaned_parent
    if @parent.children.length == 0
      @parent.destroy
    end  
  end
Run Code Online (Sandbox Code Playgroud)

根据Anwar的建议,这也可以使用around回调来完成,如下所示:

  around_destroy :destroy_orphaned_parent

  def destroy_orphaned_parent
    parent = self.parent
    yield # executes a DELETE database statement
    if parent.children.length == 0
      parent.destroy
    end  
  end
Run Code Online (Sandbox Code Playgroud)

我没有测试过上述解决方案,如有必要,请随时更新.


Tap*_*nen 7

一些想法: