如何在Rails中预览delete_all或destroy_all查询

时间:2012-06-07 16:52:13

标签: ruby-on-rails activerecord arel

您知道演习:生产数据库中会弹出一些无效数据,您必须将其删除。您在生产服务器上启动Rails控制台并输入查询:

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

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

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

你的心停了一秒钟。您只想在运行之前查看查询。

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

的方法
Foo.where(bar: 'baz').to_sql

但是会返回 DELETE 查询。

3 个答案:

答案 0 :(得分:2)

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

Cdesroisiers是正确的,您可以在沙盒模式下测试查询,但真正的问题是,即使您已经验证了所针对的数据,您仍然在猜测运行delete_all的决定。

如果您不愿意信任ActiveRecord以正确删除对象,请考虑使用像PaperTrail这样的ActiveRecord版本控制宝石。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

destroy_all方法与执行:

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

所以sql变成了

DELETE FROM foo WHERE foo.id = your_objects_id_attribute



来自docs:

  def destroy_all(conditions = nil)
    find(:all, :conditions => conditions).each { |object| object.destroy }
  end