【问题标题】:Rails delete_all is not deletingRails delete_all 没有删除
【发布时间】:2013-12-04 09:13:48
【问题描述】:

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

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

Profile.first.reports.delete_all

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

UPDATE `reports` SET `profile_id` = NULL WHERE `reports`.`profile_id` = 1 AND `reports`.`id` IN (1, 3)

我在指南中找不到任何关于此的内容,这是正确的行为吗?如果不是,是什么原因造成的?

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

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

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

has_many :reports

到:

has_many :reports, dependent: :delete_all

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

除非我遗漏了什么,否则这种行为是未记录的,但至少它现在可以按我的预期工作。

【问题讨论】:

  • 为什么不试试 Report.where('profile_id = ?', profile.id).destroy_all ?

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2


【解决方案1】:

如果您已经定义了配置文件和报告之间的关联,那么您的代码应该可以工作,否则您可以尝试

Report.where(:profile_id => Profile.first.id).delete_all

【讨论】:

  • 这确实有效,Report.delete_all(profile_id: Profile.first.id) 也有效,但我真的很想知道为什么正常的 delete_all 不起作用
  • 因为在后面的地轨正在运行某些线路 SELECT profiles.* FROM profiles LIMIT 1 SELECT reports.* FROM reports WHERE reports.profile_id = 1
【解决方案2】:

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

Report.delete_all(profile_id: Profile.first.id)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    • 2011-02-17
    • 1970-01-01
    • 1970-01-01
    • 2017-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多