Ruby On Rails:当表名称存在时禁用 `delete_all`

问题描述 投票:0回答:1

delete_all 很有用,但我不想看到它与表名在同一行上调用。我想在控制台和代码中禁用类似

TableName.destroy_all
的功能。

本月早些时候发生了一个有趣的问题:

在模型上调用

Application.destroy_all
而不是
applications.destroy_all
(该模型有_许多应用)

对于刚接触 ROR 的人来说,看起来非常相似,但结果却是灾难性的。

我对某种形式的 lint/代码风格工具持开放态度,但这确实无法在控制台场景中捕获它。 (另外,我还没能让 rubo-cop 做这样的事情)

基本上,我要求一种使控制台和代码库更安全的方法,以便新开发人员不会无意中删除表中的所有内容。

ruby-on-rails rubocop
1个回答
2
投票

我并不完全清楚你想要完成什么,但你可以尝试用类似的东西覆盖

ApplicationModel
中的方法(假设 Rails 5 或更高版本,或者存在根模型)。

class ApplicationModel < ActiveRecord::Base
  def self.destroy_all(*args)
    raise('Cannot destroy all records of a model this way. Did you mean to delete a subset of records instead?')
  end
end

如果您希望该方法更难运行,可以将其设为私有...

def self.destroy_all(*args)
  raise('Cannot destroy all records of a model this way. Did you mean to delete a subset of records instead?')
end
private_class_method :destroy_all

您可以想像一下,并允许使用您检查的特殊参数来绕过它,但请尝试一下,看看它是如何进行的。

© www.soinside.com 2019 - 2024. All rights reserved.