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.
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.
change_column_default :employees, :foreign, false
from:
and to:
if you want it to be reversible :)
For Rails 4+, use change_column_default
def change
change_column_default :table, :column, value
end
def change
` add_column :foos, :name, default: "something for existing values"` ` change_column_default :foos, :name, default: ""` end
change_column_default :products, :approved, from: true, to: false
— but it doesn't works too.
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
**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
t.boolean :is_active, :null => false, :default => false
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
Key is not present in table error
.
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!
before_save
Success story sharing
up
block rather than achange
block. You can leave thedown
block empty. It won't revert the table to the original condition but the migration can be rolled back.