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

wul*_*tch 190 ruby-on-rails rails-migrations

我有问题,我在Rails中有一个迁移设置列的默认设置,如下例所示:

def self.up
  add_column :column_name, :bought_at, :datetime, :default => Time.now
end
Run Code Online (Sandbox Code Playgroud)

假设,我想在以后的迁移中删除默认设置,如何使用rails迁移?

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

def self.up
  execute 'alter table column_name alter bought_at drop default'
end
Run Code Online (Sandbox Code Playgroud)

但我不喜欢这种方法,因为我现在依赖于底层数据库如何解释这个命令.如果数据库发生更改,此查询可能不再起作用,迁移将被破坏.那么,有没有办法表示在rails中删除列的默认设置?

Jer*_*ack 386

Rails 5+

def change
  change_column_default( :table_name, :column_name, from: nil, to: false )
end
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

  • 在更新的版本中,您可以使其可逆.例如:`change_column_default(:table_name,:column_name,from:nil,to:false)` (8认同)
  • 在postgres中,这实际上不会删除`CHARACTER VARYING`列的默认值,只需将其设置为`NULL :: character varying`. (7认同)
  • @阿提拉奥。我已经成功运行了`ALTER TABLE table_name ALTER COLUMN type DROP DEFAULT`,我认为不需要将其设置为`NULL`。 (2认同)

Ser*_*erx 23

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

change_column_default(table_name, column_name, default)
Run Code Online (Sandbox Code Playgroud)

为列设置新的默认值. 如果要将默认值设置为NULL,则表示运气不佳.您需要DatabaseStatements#自己执行适当的SQL语句. 例子

change_column_default(:suppliers, :qualification, 'new')
change_column_default(:accounts, :authorized, 1)
Run Code Online (Sandbox Code Playgroud)


Ale*_*una 14

我用以创建NULL列的以下代码段NOT NULL,但跳过DEFAULT架构级别:

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

  • 这实际上是帮助我最多的一个,因为它给出了一个示例用法... (4认同)