在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
而不调用其save
callback
请注意: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]之一