我在关注rubyonrails上的视频.org(创建博客).

我有以下型号:

议论rb

class Comment < ActiveRecord::Base
    belongs_to :post
    validates_presence_of :body # I added this
end

邮递rb

class Post < ActiveRecord::Base
    validates_presence_of :body, :title
    has_many :comments
end

模型之间的关系很好,除了一件事——当我删除帖子记录时,我希望RoR删除所有相关的 comments 记录.我知道ActiveRecords是独立于数据库的,所以没有内置的方法来创建外键、关系、ON DELETE、ON UPDATE语句.那么,有没有办法做到这一点(也许RoR本身可以删除相关 comments ?)?

推荐答案

对您可以在以下三种Rails选项中 Select 一种:

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

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

因此,在你的例子中,你可以 Select 让一篇帖子在删除帖子时删除所有相关 comments ,而不调用每个 comments 的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、:null、,

Ruby-on-rails相关问答推荐

为Rails服务器推荐的交付类型

Gemfile需要较新版本的依赖项

Rails + Turbo_stream自定义操作:我可以在没有Stimulus的情况下根据DOM状态做出有条件的响应吗?

在Rails中,如何将帮助器方法添加到属性/列?

Rails 7.1,登录到STDOUT和LOG/Production.log

使用has_many_through关联创建记录 – Ruby on Rails

Time.zone.now.to_date 是否等同于 Date.today?

PostgreSQL 无间隙序列

blueprint/screen.css 未预编译

File.open,写入和保存?

将 Amazon SES 与 Rails ActionMailer 结合使用

在 Windows 上安装特定的 Ruby on Rails 版本

使用回形针使用 Activeadmin Rails 上传文件

关于在不适合任何地方的 Rails 应用程序中放置类的指南

我如何在具有活动记录的 Rails 中使用两个不同的数据库?

Rspec:如何在控制器规范中分配实例变量

如何从另一个调用 Capistrano 任务?

Ruby 安装的 RVM 不工作?

为什么不对 Rspec + Selenium 使用共享的 ActiveRecord 连接?

从模型中获取验证