Ruby ActiveRecord 模型中的级联删除?

Posted

技术标签:

【中文标题】Ruby ActiveRecord 模型中的级联删除?【英文标题】:Cascade delete in Ruby ActiveRecord models? 【发布时间】:2010-12-26 04:32:51 【问题描述】:

我正在关注 ruby​​onrails.org 上的截屏视频(创建博客)。

我有以下型号:

comment.rb

class Comment < ActiveRecord::Base
    belongs_to :post
    validates_presence_of :body # I added this
end

post.rb

class Post < ActiveRecord::Base
    validates_presence_of :body, :title
    has_many :comments
end

模型之间的关系工作正常,除了一件事 - 当我删除帖子记录时,我希望 RoR 删除所有相关的评论记录。我知道 ActiveRecords 是独立于数据库的,所以没有内置的方法来创建外键、关系、ON DELETE、ON UPDATE 语句。那么,有什么方法可以做到这一点(也许 RoR 本身可以负责删除相关的 cmets?)?

【问题讨论】:

【参考方案1】:

是的。在 Rails 的模型关联中,您可以指定 :dependent 选项,它可以采用以下三种形式之一:

:destroy/:destroy_all 关联的对象通过调用它们的destroy 方法与该对象一起被销毁 :delete/:delete_all 所有关联对象都会立即销毁,无需调用其:destroy 方法 :nullify 所有关联对象的外键都设置为NULL 而不调用它们的save 回调

请注意,如果您设置了 :has_many X, :through =&gt; Y 关联,则会忽略 :dependent 选项。

因此,对于您的示例,您可以选择让帖子在帖子本身被删除时删除其所有关联的 cmets,而无需调用每个评论的 destroy 方法。看起来像这样:

class Post < ActiveRecord::Base
  validates_presence_of :body, :title
  has_many :comments, :dependent => :delete_all
end

Rails 4 更新:

在 Rails 4 中,您应该使用 :destroy 而不是 :destroy_all

如果你使用:destroy_all,你会得到异常:

:dependent 选项必须是 [:destroy, :delete_all, :nullify, :restrict_with_error, :restrict_with_exception]

【讨论】:

谢谢!发现您的回答很有帮助。小备注::dependent 选项的值可以是 :destroy、:delete_all 或 :nullify。 至少从 rails 4 开始, :destroy_all 不是一个选项。使用 :destroy 代替。 在 Rails 4 中,您应该使用 :destroy 而不是 :destroy_all 来自 rails 日志:The :dependent option must be one of [:destroy, :delete_all, :nullify, :restrict_with_error, :restrict_with_exception]

以上是关于Ruby ActiveRecord 模型中的级联删除?的主要内容,如果未能解决你的问题,请参考以下文章

keras中的级联模型(自动编码器+分类器)

OpenCV 级联分类器训练模型

Doctrine 2 中的级联“刷新”是啥意思?

SQL中的级联菱形删除

Mongoose中的级联样式删除

Mongoose中的级联样式删除