使用迁移更改表列的默认值

Lor*_*ory 9 ruby migration activerecord ruby-on-rails rails-activerecord

我尝试将默认列值从false更改为true.但是当我跑步时,rake db:migrate VERSION=904984092840298我得到了以下错误.

StandardError: An error has occurred, this and all later migrations canceled:

PG::InvalidTextRepresentation: ERROR:  invalid input syntax for type boolean: "---
:from: false
:to: true
"
: ALTER TABLE "plussites" ALTER COLUMN "hide_season_selector" SET DEFAULT '---
:from: false
:to: true
'
Run Code Online (Sandbox Code Playgroud)

移民

class ChangeDefaultvalueForHideSeasonSelector < ActiveRecord::Migration 
  def change 
    change_column_default :plussites, :hide_season_selector, from: false, to: true 
  end
end
Run Code Online (Sandbox Code Playgroud)

Fa1*_*gel 31

您必须检查您使用的是哪个版本的 ActiveRecord。根据您的命令,rake db:migrate您仍在使用 rails 4.2 或更早版本。

如果您在 ActiveRecord 上使用高达 4.2 ( change_column_default 4.2.9 ),则没有 from/to 选项,您只能将新的默认选项定义为 param。

class ChangeDefaultvalueForHideSeasonSelector < ActiveRecord::Migration 
  def change 
    change_column_default :plussites, :hide_season_selector, true 
  end
end
Run Code Online (Sandbox Code Playgroud)

上面的解决方案不允许回滚,因为该方法不知道以前的默认值是什么。这就是为什么你必须定义一个单独的 up 和 down 方法:

class ChangeDefaultvalueForHideSeasonSelector < ActiveRecord::Migration
  def up
    change_column_default :plussites, :hide_season_selector, true
  end

  def down
    change_column_default :plussites, :hide_season_selector, false
  end
end
Run Code Online (Sandbox Code Playgroud)

如果您使用的是 rails 5 或更新版本,则可以通过 from/to ( change_column_default 5.0.0.1 )定义之前的值和之后的值。在 rails 5 上,您可以使用您选择的解决方案:

class ChangeDefaultvalueForHideSeasonSelector < ActiveRecord::Migration 
  def change 
    change_column_default :plussites, :hide_season_selector, from: false, to: true 
  end
end
Run Code Online (Sandbox Code Playgroud)

我希望这个解释能帮助那些在另一个答案下发表评论的人。


And*_*eko 15

这很奇怪,因为根据文档(change_column_default)你的代码应该工作..

作为一个选项,您可以定义updown:

class ChangeDefaultvalueForHideSeasonSelector < ActiveRecord::Migration
  def up
    change_column_default :plussites, :hide_season_selector, true
  end

  def down
    change_column_default :plussites, :hide_season_selector, false
  end
end
Run Code Online (Sandbox Code Playgroud)