Deploy and update the column in a rake task or on the console while your app is running. Make sure your application already writes data to that colum for new/updated rows. Add another change_column migration, which then changes the default of that column to the desired default value.
change_column
is a method of ActiveRecord::Migration
, so you can't call it like that in the console.
If you want to add a default value for this column, create a new migration:
rails g migration add_default_value_to_show_attribute
Then in the migration created:
# That's the more generic way to change a column
def up
change_column :profiles, :show_attribute, :boolean, default: true
end
def down
change_column :profiles, :show_attribute, :boolean, default: nil
end
OR a more specific option:
def up
change_column_default :profiles, :show_attribute, true
end
def down
change_column_default :profiles, :show_attribute, nil
end
Then run rake db:migrate
.
It won't change anything to the already created records. To do that you would have to create a rake task
or just go in the rails console
and update all the records (which I would not recommend in production).
When you added t.boolean :show_attribute, :default => true
to the create_profiles
migration, it's expected that it didn't do anything. Only migrations that have not already been ran are executed. If you started with a fresh database, then it would set the default to true.
As a variation on the accepted answer you could also use the change_column_default
method in your migrations:
def up
change_column_default :profiles, :show_attribute, true
end
def down
change_column_default :profiles, :show_attribute, nil
end
Rails API-docs
I'm not sure when this was written, but currently to add or remove a default from a column in a migration, you can use the following:
change_column_null :products, :name, false
Rails 5:
change_column_default :products, :approved, from: true, to: false
http://edgeguides.rubyonrails.org/active_record_migrations.html#changing-columns
Rails 4.2:
change_column_default :products, :approved, false
http://guides.rubyonrails.org/v4.2/active_record_migrations.html#changing-columns
Which is a neat way of avoiding looking through your migrations or schema for the column specifications.
If you just made a migration, you can rollback and then make your migration again.
To rollback you can do as many steps as you want:
rake db:rollback STEP=1
Or, if you are using Rails 5.2 or newer:
rails db:rollback STEP=1
Then, you can just make the migration again:
def change
add_column :profiles, :show_attribute, :boolean, default: true
end
Don't forget to rake db:migrate
and if you are using heroku heroku run rake db:migrate
Also, as per the doc:
default cannot be specified via command line
https://guides.rubyonrails.org/active_record_migrations.html
So there is no ready-made rails generator. As specified by above answers, you have to fill manually your migration file with the change_column_default
method.
You could create your own generator: https://guides.rubyonrails.org/generators.html
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With