2009-05-20 117 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