您知道演习:生产数据库中会弹出一些无效数据,您必须将其删除。您在生产服务器上启动Rails控制台并输入查询:
Foo.where(bar: 'baz').all
您查看返回的数据,这是您需要删除的内容。然后输入:
Foo.where(bar: 'baz').destroy_all
你的心停了一秒钟。您只想在运行之前查看查询。
在Rails中有没有办法做到这一点?我正在寻找类似于
的方法Foo.where(bar: 'baz').to_sql
但是会返回 DELETE 查询。
答案 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