Rails delete_all 没有删除

Mat*_*man 6 ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2

我有一个带有以下模型的 rails 3.2.8 应用程序:配置文件和报告。Profile 有很多 Reports,其中的 Reports 属于一个 Profile

如果我尝试删除特定配置文件的所有报告:

Profile.first.reports.delete_all
Run Code Online (Sandbox Code Playgroud)

它没有删除报告,而是使用类似于以下内容的 SQL 将它们的 profile_id 设置为 nil:

UPDATE `reports` SET `profile_id` = NULL WHERE `reports`.`profile_id` = 1 AND `reports`.`id` IN (1, 3)
Run Code Online (Sandbox Code Playgroud)

我在指南中找不到任何关于此的信息,这是正确的行为吗?如果不是什么会导致它?

值得注意的是,使用 destroy_all 可以正常工作,就像在单个 Report 上使用 destroy 和 delete 一样。

编辑(因为我还不能回答我自己的问题):

从以下位置更改配置文件的关系:

has_many :reports
Run Code Online (Sandbox Code Playgroud)

到:

has_many :reports, dependent: :delete_all
Run Code Online (Sandbox Code Playgroud)

已经解决了这个问题,我猜如果你没有指定依赖,它默认为:nullify,并且调用 Profile.first.reports.delete_all 并没有真正删除,而是执行依赖中指定的操作。

除非我遗漏了一些东西,否则这种行为是没有记录的,但至少它现在按我的预期工作。

小智 0

我已经对其进行了一些测试,但它应该适用于您的情况:

Report.delete_all(profile_id: Profile.first.id)
Run Code Online (Sandbox Code Playgroud)