9

你知道演习:一些无效数据在生产数据库中弹出,你必须摆脱它。在生产服务器上启动 Rails 控制台并输入查询:

Foo.where(bar: 'baz').all

您查看返回的数据,这就是您需要删除的数据。然后你输入:

Foo.where(bar: 'baz').destroy_all

你的心跳会停止一秒钟。您只想在查询运行之前查看它。

在 Rails 中有没有办法做到这一点?我正在寻找类似的方法

Foo.where(bar: 'baz').to_sql

但是将返回DELETE查询的那个。

4

3 回答 3

2

问题是destroy_all不运行单个 SQL 查询。它遍历对象的散列,实例化它们,运行它们的回调,然后调用该对象的destroy方法。Rails 没有生成这些查询数组的内置方法。

delete_allCdesroisiers 是正确的,您可以在沙盒模式下测试查询,但真正的问题是,即使您已经验证了任何目标数据,您仍然在猜测您的决定是否运行。

如果您不愿意相信 ActiveRecord 能够正确删除对象,请考虑使用像PaperTrail这样的 ActiveRecord 版本控制 gem。

于 2012-06-07T17:56:45.447 回答
1

destroy_all 方法与执行以下操作相同:

Foo.where(bar: 'baz').each { |object| object.destroy }

所以sql变成了

DELETE FROM foo WHERE foo.id = your_objects_id_attribute



来自文档:

  def destroy_all(conditions = nil)
    find(:all, :conditions => conditions).each { |object| object.destroy }
  end
于 2012-06-07T19:00:22.637 回答
1

就在我的脑海中,您可以在沙盒模式下运行控制台并运行删除查询以查看 sql。更改只会在退出时回滚。

于 2012-06-07T17:38:42.863 回答