'Change the default value for table column with migration
I try to change the default column value from false to true. But when I run rake db:migrate VERSION=904984092840298
I got the following ERROR.
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
'
Migration
class ChangeDefaultvalueForHideSeasonSelector < ActiveRecord::Migration
def change
change_column_default :plussites, :hide_season_selector, from: false, to: true
end
end
Solution 1:[1]
It is strange, because according to documentation (change_column_default
) your code should work..
As an option you might define up
and 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
Solution 2:[2]
You have to check which version of ActiveRecord you are using. According to your command rake db:migrate
you are still on Ruby on Rails 4.2 or earlier.
If you are on ActiveRecord up to 4.2 (change_column_default 4.2.9), there is no from/to option and you can define only the new default option as param.
class ChangeDefaultvalueForHideSeasonSelector < ActiveRecord::Migration
def change
change_column_default :plussites, :hide_season_selector, true
end
end
The solution above won't allow a rollback as the method don't know, what the previous default value was. This is why you have to define an separate up and down method:
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
If you are on Ruby on Rails 5 or newer, there are new possibilities to define the value which was before and which one should be after by from/to (change_column_default 5.0.0.1). On Ruby on Rails 5 you can use your chosen solution:
class ChangeDefaultvalueForHideSeasonSelector < ActiveRecord::Migration[5.0]
def change
change_column_default :plussites, :hide_season_selector, from: false, to: true
end
end
I hope this explanation will help the people with comments under the other answer.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | |
Solution 2 |