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


190

我有一个问题,我在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中某个列的默认设置的撤消?

Answers:


387

滑轨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

7
在postgres中,这实际上不会删除CHARACTER VARYING列的默认值,只需将其设置为即可NULL::character varying
Attila O. 2014年

8
在较新的版本中,您可以使其可逆。例如: change_column_default(:table_name, :column_name, from: nil, to: false)
Mark

1
@AttilaO。我已经成功运行了ALTER TABLE table_name ALTER COLUMN type DROP DEFAULT,无需将其设置为NULL我认为的水平。
伊莱·罗斯

仅供参考,看起来@Mark提到的可逆版本是在Rails 5+中添加的,因此低于此版本的任何内容都将无法使用。
Joshua Pinter

23

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

change_column_default(table_name, column_name, default)

为列设置新的默认值。 如果要将默认值设置为NULL,则很不走运。您需要自己执行DatabaseStatements#execute适当的SQL语句。 例子

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

谢谢!我自己没有在文档中找到此提示!Hopefull他们将默认值放入将来的Rails迁移中。
wulfovitch

1
从Rails 3.1.0,cfr开始,情况不再如此。apidock.com/rails/v3.1.0/ActiveRecord/ConnectionAdapters/…–
不对称的

14

以下代码段用于创建NULLNOT NULL,但DEFAULT在架构级别跳过:

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

我看不到此答案的附加值,因为被接受的人表示相同。
Mosselman

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.