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)
以下代码片段用于使NULL
列NOT 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