Rails migrations are just Ruby code. In your Rails app, your migrations are stored in
db/migrate (relative to the Rails root).
A migration, by definition, is a change to the database schema, but the first change to make is to generate a table if you haven't already, which you can review in more detail at Writing a Rails Model.
1) Generate the Migration Files
For general changes, the easiest way about it is to have Rails generate the migration files you need for you. In your command line, in the Rails root, type:
rails g migration migration_description
rails g migration change_username_field_to_email
Like generating a model, Rails will generate a few files for you when generating a migration. The first is the migration file itself, located in
db/migrate, which in this case would be named
YYYYMMDDHHMMSS_change_username_field_to_email. Check here for more info on Migration Naming Conventions.
ProTip: If the migration name you write in this step is of the form “AddXXXToYYY” or “RemoveXXXFromYYY” and is followed by a list of column names and types, then a migration containing the appropriate addcolumn and removecolumn statements will be created for you (otherwise the next step in the process). Bada-bing.
rails generate migration AddPartNumberToProducts part_number:string
2) Write the Up & Down Methods or Change Method in the Migration file
The migration file will already be written for us, and will start with this line:
class ClassName < ActiveRecord::Migration
In our example:
class ChangeUsernameFieldToEmail < ActiveRecord::Migration
For more info on this line, check out the section on Writing a Rails Model.
If we were writing a constructive migration like adding a column or a table, we'd want to name the method in the next line
change. Since instead we're changing a column, we'll need to create two methods:
down (where up is the change we want to make, and down is its inverse--a fallback in case we want to undo our changes). Check here for more details on Changing Migrations.
def up change_column :users, :username, :email end def down change_column :users, :email, :username end
How did we know what the names of these methods were? Simple, check Migration Methods for a complete list of methods we can use to change our database schema.
How did we know whether to use
down is going to be the safest bet in all cases (today), but there's also a list of the methods
3) Run the Migration File
The migration is almost complete. Back in the command line, in the Rails root, we'll run:
Which will run the migration file, make the changes to our database, and update our schema.
4) Change the Model Class
The last change is to update the Model class to accurately reflect the change we made. The model file is located in
app/models/modelName.rb. Again, we changed the name of username to email, so in the class, we'll change the name too:
class User < ActiveRecord::Base validates :email, presence: true end
That's it! We've successfully changed our database, and the Model class that we use to speak to it. Sweet!