51

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

我有以下型号:

评论.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 本身可以负责删除相关评论?)?

4

1 回答 1

92

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

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

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

因此,对于您的示例,您可以选择让帖子在帖子本身被删除时删除其所有相关评论,而不调用每个评论的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] 之一

于 2009-12-13T15:28:36.453 回答