Ruby ActiveRecord模型中的级联删除?

时间:2009-12-13 15:08:42

标签: ruby-on-rails rails-activerecord database-relations

我正在关注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本身可以处理删除相关的评论?)?

1 个答案:

答案 0 :(得分:84)

是。在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]