Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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 
like image 638
Lory Avatar asked Mar 08 '17 10:03

Lory


People also ask

How do I change the default value of a column in laravel migration?

In our case we are going to do second option - create new migration. If we roll back this migration, we need to remove default value from that field using migration and this is how to do it: Schema::table('photos', function (Blueprint $table) { $table->integer('order')->default(NULL)->change(); });


1 Answers

You have to check which version of ActiveRecord you are using. According to you command rake db:migrate you are still 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 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 rails 5 you ca use your chosen solution:

class ChangeDefaultvalueForHideSeasonSelector < ActiveRecord::Migration    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.

like image 61
Fa11enAngel Avatar answered Sep 29 '22 10:09

Fa11enAngel