Ruby ActiveRecord 模型中的级联删除?
Posted
技术标签:
【中文标题】Ruby ActiveRecord 模型中的级联删除?【英文标题】:Cascade delete in Ruby ActiveRecord models? 【发布时间】:2010-12-26 04:32:51 【问题描述】:我正在关注 rubyonrails.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 => 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 模型中的级联删除?的主要内容,如果未能解决你的问题,请参考以下文章