Rails迁移:撤消列的默认设置

我遇到这个问题,我在Rails中进行了一个迁移,为列设置了一个默认设置,如下例所示:

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

假设,我希望在以后的迁移中删除这些默认设置,那么如何使用rails迁移来做到这一点?

我当前的解决方法是在rails迁移中执行自定义sql命令,如下所示:

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

但我不喜欢这种方法,因为我现在依赖于底层数据库如何解释这个命令。 在数据库发生变化的情况下,这个查询可能不再起作用,迁移将被打破。 那么,有没有一种方法来expression一个栏的默认设置撤消轨?

change_column_default(table_name, column_name, nil)也可以完全删除列的默认值。 不需要使用执行。

听起来你正在用“执行”来做正确的事情,正如文档指出的那样:

 change_column_default(table_name, column_name, default) 

为列设置一个新的默认值。 如果你想将默认值设置为NULL,那么你运气不好。 你需要DatabaseStatements#自己执行适当的SQL语句。 例子

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

以下代码片段用于使NULLNOT NULL ,但在模式级别跳过DEFAULT

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

Rails 4

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