2012-06-07 18 views
7

您知道該演練:在生產數據庫中彈出一些無效數據,您必須清除它。你火起來的生產服務器和類型上你的Rails控制檯查詢:如何在Rails中預覽delete_all或destroy_all查詢

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

您檢查所返回的數據與您需要刪除的內容。然後你鍵入:

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

而你的心停下來一秒鐘。您只想在運行之前查看該查詢。

有沒有辦法在Rails中做到這一點?我在尋找類似的方法來

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

,但一個將返回DELETE查詢。

回答

1

就在我頭頂,您可以在沙盒模式下運行控制檯並運行刪除查詢來查看sql。這些更改只會在退出時回滾。

+0

我想這並沒有真正的儘管回答你的問題,如果你真的想找一個「to_sql」的通信和。 – cdesrosiers

+0

我完全忘了沙箱模式!這不是我正在尋找的東西,但它確實是我需要它做的。特別是考慮到我所尋找的是不可能的:D –

2

問題是,destroy_all不會運行單個SQL查詢。它迭代對象的散列,實例化它們,運行它們的回調,然後調用該對象的destroy方法。 Rails沒有內置的方式來產生這些查詢的數組。

Cdesroisiers是正確的,你可以在沙盒模式下測試查詢,但真正的問題是,即使你已經驗證了任何數據的目標,你仍然在猜測你運行delete_all的決定。

考慮使用ActiveRecord版本控制寶石,如PaperTrail,如果您不願意信任ActiveRecord以正確刪除對象。

+0

不執行'delete_all'作爲批處理操作的理由是什麼我認爲在批處理中執行而不是嚴格執行數據庫往返操作要便宜得多。 – Bedasso

+2

delete_all是一個批處理操作。 destroy_all一個接一個地完成它們。 delete_all的存在是因爲它更快,destroy_all可以是有用的,因爲它會在銷燬回調之前/之後觸發。 –

+0

PaperTrail非常適合在應用程序中使用,但我只需要擺脫一些冗餘數據。不管怎麼說,還是要謝謝你! –

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 
+1

我相信生成的SQL將由多個DELETE查詢組成 - 每找到一個對象一個。 – mrt