Rails - 如果没有孩子,则删除对象

时间:2015-03-12 21:43:15

标签: ruby-on-rails ruby-on-rails-4

我正在努力解决以下问题:当没有孩子时(或者更准确地说最后一个孩子被摧毁),如何强迫对象销毁。我尝试了以下解决方案:

  • 将计数器缓存添加到父级并在它等于0时销毁他,但是我无法使用Factory Girl创建它,它会立即被销毁。
  • 来自Delete Orphaned Parent的最后一个解决方案,不幸的是它无法使用destroy_all - 我得到了堆栈溢出。

我找不到任何其他最新的解决方案。任何人都知道如何做到这一点?

2 个答案:

答案 0 :(得分:1)

处理此问题的一种方法是在子对象的after_destroy回调中。这是一个名为Parent和Child的两个模型的例子:

class Parent < ActiveRecord::Base
  has_many :children
end

class Child < ActiveRecord::Base
  belongs_to :parent

  after_destroy: :destroy_orphaned_parent

  def destroy_orphaned_parent
    parent.destroy if parent.children.empty?
  end
end

此解决方案适用于destroy_all,可用于在FactoryGirl中创建没有子项的父记录。

答案 1 :(得分:0)

我建议如下: (1)子模型不能调用parent_model.destory,这是针对模型设计模式的。 (2)在父模型after_update回调中,检查children.count&gt;如果没有找到关联,则销毁。