2009-05-20 114 views
185

我有問題,我有Rails中的遷移,設置了一個默認的設置列,這樣的例子:Rails遷移:撤消默認設置列

def self.up 
    add_column :column_name, :bought_at, :datetime, :default => Time.now 
end 

想,我喜歡在稍後的遷移中刪除這些默認設置,我如何使用rails遷移來實現這一點?

我目前的解決方法是在鐵軌遷移自定義SQL命令的執行,就像這樣:

def self.up 
    execute 'alter table column_name alter bought_at drop default' 
end 

但我不喜歡這種方式,因爲我現在依賴於底層數據庫是如何解釋這個命令。在數據庫發生變化的情況下,這個查詢可能不再起作用,並且遷移將被打破。那麼,有沒有辦法在rails中表達一個列的默認設置?

回答

375

change_column_default(table_name, column_name, nil)也適用於完全刪除列的默認值。不需要使用執行。

+7

在postgres中,這實際上不會放棄`CHARACTER VARYING`列的默認值,只需將其設置爲`NULL :: character varying `。 – 2014-10-27 10:36:34

+7

在更新的版本中,您可以使其可逆。例如:`change_column_default(:table_name,:column_name,from:nil,to:false)` – Mark 2017-02-23 19:17:15

22

Sounds就像你有做正確的事的「執行」,作爲文檔指出:

change_column_default(table_name, column_name, default) 

設置一列新的默認值。 如果您想將默認值 設置爲NULL,那麼您運氣不好。您需要 來DatabaseStatements#自己執行適當的SQL語句 。 例子

change_column_default(:suppliers, :qualification, 'new') 
change_column_default(:accounts, :authorized, 1) 
+0

謝謝!我還沒有在自己的文檔中找到這個提示! Hopefull構建了將未來版本的Rails中的默認值放入遷移中的過程。 – wulfovitch 2009-05-20 12:33:31

+1

從Rails 3.1.0開始,這不是真的,cfr。 http://apidock.com/rails/v3.1.0/ActiveRecord/ConnectionAdapters/SchemaStatements/change_column_default – asymmetric 2013-06-25 12:28:08

14

下面的片段我使用,使NULLNOT NULL,但在架構級別跳過DEFAULT

def self.up 
    change_column :table, :column, :string, :null => false, :default => "" 
    change_column_default(:table, :column, nil) 
end 
-3

軌道4

change_column :courses, :name, :string, limit: 100, null: false