如何在活动记录中级联删除多态关联?

时间:2016-03-24 16:10:38

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

我们以此案为例:

class Child < ActiveRecord::Base
    belongs_to :fruitful, polymorphic: true
end

class Parent < ActiveRecord::Base
    has_many :children, as: :fruitful, dependent: :destroy
end

# Once I create the parent and children
p = Parent.create
p.children << Child.new
p.children << Child.new
p.save

# But deleting parent does not delete children:
p.destroy  # why not?

问题变成,“依赖:: destroy”不支持活动记录的多态关联,我是否需要实现before_destroy回调以防止孤立记录?

3 个答案:

答案 0 :(得分:1)

那应该是belongs_to :parent吗?

您可能只需在致电parent.reload之前致电parent.destroy,以便了解其中的儿童身份。执行<< Child.new时,内存中的对象可能无法准确反映数据。

修改:This guy explains it better

在实践中,我希望你在操作它的孩子后通常不会直接销毁一个物体,所以这可能是一个控制台问题,你不应该在你的应用程序中reload

答案 1 :(得分:0)

如果你需要删除孩子,父母也要自动删除

使用以下

class Child < ActiveRecord::Base
belongs_to :fruitful, polymorphic: true , dependent: :destroy

答案 2 :(得分:0)

使用destroy而不是delete

:destroy,当对象被销毁时,销毁对象将被调用 相关对象。 :delete,当对象被销毁时,其所有 关联的对象将直接从数据库中删除,而无需 调用他们的destroy方法。