在Ruby ActiveRecord模型中级联删除?

我正在关注rubyonrails.org上的截屏(创build博客)。

我有以下型号:

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 

模型之间的关系正常工作,除了一件事情 – 当我删除一个postlogging,我希望RoR删除所有相关的评论logging。 我知道ActiveRecords是独立于数据库的,所以没有内build的方法来创build外键,关系,ON DELETE,ON UPDATE语句。 那么,有没有办法做到这一点(也许RoR本身可以照顾删除相关的评论?)?

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

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

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

因此,对于您的示例,您可能会select在post本身被删除时删除所有相关注释,而不调用每个注释的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 ,你会得到exception:

:依赖选项必须是[:destroy,:delete_all,:nullify,:restrict_with_error,:restrict_with_exception]之一