ChatGPT解决这个技术问题 Extra ChatGPT

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 中列的默认设置?


J
Joshua Pinter

导轨 5+

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

导轨 3 和导轨 4

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

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

在 postgres 中,这实际上不会删除 CHARACTER VARYING 列的默认值,只需将其设置为 NULL::character varying
在更新的版本中,您可以使其可逆。例如:change_column_default(:table_name, :column_name, from: nil, to: false)
@AttilaO。我已经成功运行 ALTER TABLE table_name ALTER COLUMN type DROP DEFAULT,我认为无需将其设置为 NULL
仅供参考,看起来@Mark 提到的可逆版本是在 Rails 5+ 中添加的,所以低于此的任何内容,您将无法使用它。
S
Serx

Sounds 就像您在“执行”中做正确的事情一样,正如文档指出的那样:

change_column_default(table_name, column_name, default) 为列设置新的默认值。如果您想将默认值设置为 NULL,那么您就不走运了。您需要自己执行 DatabaseStatements#execute 相应的 SQL 语句。示例 change_column_default(:suppliers, :qualification, 'new') change_column_default(:accounts, :authorized, 1)


谢谢!我自己没有在文档中找到这个提示!希望他们在未来版本的 Rails 中将默认值放入迁移中。
从 Rails 3.1.0 开始,这不再适用,cfr。 apidock.com/rails/v3.1.0/ActiveRecord/ConnectionAdapters/…
A
Alex Fortuna

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

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

我没有在这个答案中看到附加值,因为接受的答案相同。
P
Pardeep Dhingra

导轨 4

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

这个加了NOT NULL约束,跟DEFAULT无关
与 DEFAULT +1 无关