2010-10-10 49 views

回答

4

代碼本身很簡單。

Note.delete_all :type => 'short_note' 

(如果有票據銷燬回調,你需要運行destroy_all來代替。這是慢,因爲他們刪除一個接一個,但有時會產生更好的數據完整性。)

然而,我想你比上升的遷移更擔心下移遷。它本質上是一個不可逆轉的轉變。這個問題的答案是,你的遷移應該引起一個異常。

但是,無論何時寫入不可逆遷移,重要的是要考慮爲什麼要這樣做。根據您的情況,在部署到生產環境時,在控制檯中運行該特定命令,而不是將應用程序的定義轉換爲部分應用程序更合適。

+0

不,不要指定':conditions'鍵! 'delete_all'方法只需要條件,而不是一般的'find'規範。 – 2010-10-10 01:32:10

+0

@Chris Jester-Young:很好:) :)修正。 – Matchu 2010-10-10 01:33:35

0
def self.up 
    execute "DELETE FROM notes WHERE note_type = 'short_note'" 
end 

:-P

只是開個玩笑。我敢肯定,你可以這樣做:

Note.delete_all :note_type => 'short_note' 
0

在self.up:

Note.delete_all("type = 'short_note'"); 

或使用destroy_all它將調用記錄的銷燬方法和回調(before_destroy和after_destroy):

Note.destroy_all("type = 'short_note'"); 
+0

我非常喜歡在可能的情況下使用散列和/或數組形式,並且只有在必須直接寫SQL時才使用字符串形式。這樣,沒有人會試圖將它重構爲SQL注入的形式,以防他們想要刪除參數化類型。 – 2010-10-10 01:31:21

+0

如果值爲空,我們將如何寫入。 '「type = NULL」'? – 2013-11-06 10:39:20