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)你的代码应该工作..
作为一个选项,您可以定义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)