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

但是我不喜欢这种方法,因为我现在依赖于底层数据库如何解释这个命令。如果数据库发生更改,这个查询可能不再工作,迁移将中断。那么,有没有一种方法可以表示 Rails 中列的默认设置的撤消呢?

45057 次浏览

Rails 5 +

def change
change_column_default( :table_name, :column_name, from: nil, to: false )
end

Rails3和 Rails4

def up
change_column_default( :table_name, :column_name, nil )
end


def down
change_column_default( :table_name, :column_name, false )
end

下面的代码片段用于创建 NULLNOT NULL,但是在模式级别跳过 DEFAULT:

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

铁路4

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