【问题标题】:Removing default value from Rails Migration从 Rails 迁移中删除默认值
【发布时间】:2014-08-18 06:02:30
【问题描述】:

我发现了几个关于编辑迁移的类似问题,但无法解决这个问题。我做了一个 Rails 迁移,然后打开了迁移文件并在该字段中添加了一个默认值选项。然后运行 ​​rake db:migrate。默认值按预期填充。然后经过几次迁移,我决定要删除默认值选项。我怎么做?

如果这是我做的最后一次迁移,我会使用 db:rollback 并重新创建,但由于之前已经完成了几次迁移,我不知道如何解决这个问题。

感谢您的帮助。

【问题讨论】:

  • 这就是version numbers 发挥作用的地方。试试rake db:rollback:up VERSION=version_number_of_that_specific_migration_file
  • 谢谢!我没有进行回滚,但我从迁移文件中删除了默认值选项并且它起作用了。这不是编辑迁移的正确方法吗?
  • 如果不先回滚,就无法重新运行迁移。
  • 知道了。谢谢。乍一看我认为它有效,但你是对的。我需要回滚。

标签: ruby-on-rails-4 rails-migrations


【解决方案1】:

创建一个新的迁移并使用change_column_default

http://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/change_column_default

为列设置新的默认值:

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

将默认值设置为 nil 会有效地删除默认值:

change_column_default(:users, :email, nil)

【讨论】:

  • 我无法让它工作。我运行rails generate migraton change_column_default(:orders, :tracking, nil) 并收到此错误 sh.exe": syntax error near unexpected token `('。我在这里缺少什么?
  • 所以我从命令中删除了括号并运行了迁移,但它生成了一个带有def change end 的空迁移文件。我跑了 rake db:migrate 但正如我所想,它没有做任何事情。我仍然有我之前迁移时的默认值。
  • 不,只需生成一个迁移并将其命名为类似change_default_on_suppliers_qualification 的相关名称,然后编辑迁移并添加change_column_default 方法。并非所有内容都可以为您自动生成。
  • @sevenseacat 这个方法很有用。但是在运行此迁移时,这是否也会更改现有记录的值?
  • @Vishal 不,它只会更改新插入行的默认值。其他行已经设置了值。
【解决方案2】:

导轨 5+

传递包含:from:to 的哈希将使此更改成为可逆迁移:

change_column_default(:posts, :state, from: nil, to: "draft")

因此,我建议尽可能使用这种格式。

【讨论】:

  • 添加了什么版本的 Rails?在 Rails 4 中,我在 schema.rb 中获得了 default: "---\n:from: ''\n:to: \n",在 db:rollback 中获得了 ActiveRecord::IrreversibleMigration
  • 回答我自己的问题,它看起来像是在 Rails 5 中添加的。我将编辑你的答案以包括它以避免其他运行 Rails 4 和 3 的人遇到麻烦。这是添加它的 PR: github.com/rails/rails/pull/20018/commits/…
  • 感谢@JoshuaPinter,我一定是在回答时错过了它是最近添加的。为了使这种迁移在 rails 版本中可逆,您可以在迁移中显式定义 updown 方法,而不是单个 change 方法。
  • 没错。老派的方式。令人不安的是 Rails 不会抛出错误。相反,它会为 default 值添加一些序列化的垃圾。
  • 我发现使用from: nil, to: 'somedefault' 时回滚不会删除默认值。我必须使用可逆来指定回滚使用change_column_default(:some_things, :some_column, nil)。注意:我使用的是 postgres。
猜你喜欢
  • 1970-01-01
  • 2016-11-16
  • 2017-10-19
  • 2017-07-11
  • 1970-01-01
  • 1970-01-01
  • 2018-09-22
  • 2016-10-06
  • 1970-01-01
相关资源
最近更新 更多