ruby-on-rails Ruby ActiveRecord模型中的级联删除?

fiei3ece  于 12个月前  发布在  Ruby
关注(0)|答案(1)|浏览(166)

我在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


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

zbq4xfa0

zbq4xfa01#

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

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

请注意,如果设置了:has_many X, :through => Y关联,则:dependent选项将被忽略。
因此,对于您的示例,您可以选择在帖子本身被删除时删除所有与其关联的评论,而不调用每个评论的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,:nulify,:restrict_with_error,:restrict_with_exception]之一

相关问题