Add a default value to a column through a migration
Ruby on-RailsRubyMigrationRuby on-Rails Problem Overview
How do I add a default value to a column that already exists through a migration?
All the documentation I can find shows you how to do it if the column doesn't already exist but in this case it does.
Ruby on-Rails Solutions
Solution 1 - Ruby on-Rails
Here's how you should do it:
change_column :users, :admin, :boolean, :default => false
But some databases, like PostgreSQL, will not update the field for rows previously created, so make sure you update the field manaully on the migration too.
Solution 2 - Ruby on-Rails
change_column_default :employees, :foreign, false
Solution 3 - Ruby on-Rails
For Rails 4+, use change_column_default
def change
change_column_default :table, :column, value
end
Solution 4 - Ruby on-Rails
Using def change
means you should write migrations that are reversible. And change_column
is not reversible. You can go up but you cannot go down, since change_column
is irreversible.
Instead, though it may be a couple extra lines, you should use def up
and def down
So if you have a column with no default value, then you should do this to add a default value.
def up
change_column :users, :admin, :boolean, default: false
end
def down
change_column :users, :admin, :boolean, default: nil
end
Or if you want to change the default value for an existing column.
def up
change_column :users, :admin, :boolean, default: false
end
def down
change_column :users, :admin, :boolean, default: true
end
Solution 5 - Ruby on-Rails
Rails 4.X +
As of Rails 4 you can't generate a migration to add a column to a table with a default value, The following steps add a new column to an existing table with default value true or false.
1. Run the migration from command line to add the new column
$ rails generate migration add_columnname_to_tablename columnname:boolean
The above command will add a new column in your table.
2. Set the new column value to TRUE/FALSE by editing the new migration file created.
class AddColumnnameToTablename < ActiveRecord::Migration
def change
add_column :table_name, :column_name, :boolean, default: false
end
end
3. To make the changes into your application database table, run the following command in terminal
$ rake db:migrate
Solution 6 - Ruby on-Rails
Execute:
rails generate migration add_column_to_table column:boolean
It will generate this migration:
class AddColumnToTable < ActiveRecord::Migration
def change
add_column :table, :column, :boolean
end
end
Set the default value adding :default => 1
> add_column :table, :column, :boolean, :default => 1
Run:
> rake db:migrate
Solution 7 - Ruby on-Rails
This is what you can do:
class Profile < ActiveRecord::Base
before_save :set_default_val
def set_default_val
self.send_updates = 'val' unless self.send_updates
end
end
EDIT: ...but apparently this is a Rookie mistake!