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

时间:2009-05-20 10:42:52

标签: ruby-on-rails rails-migrations

我遇到了问题,我在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中列的默认设置?

4 个答案:

答案 0 :(得分:386)

Rails 5 +

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

Rails 3和Rails 4

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

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

答案 1 :(得分:23)

Sounds就像你正在用'执行'做正确的事情一样,正如文档所指出的那样:

change_column_default(table_name, column_name, default)
     

为列设置新的默认值。   如果要设置默认值   为了NULL,你运气不好。你需要   到DatabaseStatements#执行   自己适当的SQL语句。   实例

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

答案 2 :(得分:14)

我使用以下代码段制作NULLNOT NULL,但在架构级别跳过DEFAULT

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

答案 3 :(得分:-3)

Rails 4

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