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.
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.
 
    
    For Rails 4+, use change_column_default
def change
  change_column_default :table, :column, value
end
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
 
    
    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.
$ rails generate migration add_columnname_to_tablename columnname:boolean
The above command will add a new column in your table.
class AddColumnnameToTablename < ActiveRecord::Migration
  def change
    add_column :table_name, :column_name, :boolean, default: false
  end
end
$ rake db:migrate
 
    
     
    
    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
 
    
    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!
 
    
    