Creating a table

If the migration name is of the form “CreateXXX” and is followed by a list of column names and types then a migration creating the table XXX with the columns listed will be generated.

$ rails g migration CreateUsers email:string:index

db/migrate/20161201203703_create_users.rb

class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.string :email
    end
    add_index :users, :email
  end
end

Adding a new column to table

If the migration name is of the form “AddXXXToYYY” or “RemoveXXXFromYYY” and is followed by a list of column names and types then a migration containing the appropriate add_column and remove_column statements will be created.

rails generate migration AddPartNumberToProducts part_number:string

db/migrate/20161201204626_add_part_number_to_products.rb

class AddPartNumberToProducts < ActiveRecord::Migration
  def change
    add_column :products, :part_number, :string
  end
end

Removing a column from table

rails generate migration RemovePartNumberFromProducts part_number:string

db/migrate/20161201204909_remove_part_number_from_products.rb

class RemovePartNumberFromProducts < ActiveRecord::Migration
  def change
    remove_column :products, :part_number, :string
  end
end

Adding a reference to table

rails generate migration AddUserRefToProducts user:references

db/migrate/20161201205056_add_user_ref_to_products.rb

class AddUserRefToProducts < ActiveRecord::Migration
  def change
    add_reference :products, :user, index: true, foreign_key: true
  end
end

Creating a join table

rails g migration CreateJoinTableCustomerProduct customer product

db/migrate/20161201205222_create_join_table_customer_product.rb

class CreateJoinTableCustomerProduct < ActiveRecord::Migration
  def change
    create_join_table :customers, :products do |t|
      # t.index [:customer_id, :product_id]
      # t.index [:product_id, :customer_id]
    end
  end
end

Adding a new column to table with modifiers

rails generate migration AddDetailsToProducts 'price:decimal{5,2}' supplier:references{polymorphic}

db/migrate/20161201205408_add_details_to_products.rb

class AddDetailsToProducts < ActiveRecord::Migration
  def change
    add_column :products, :price, :decimal, precision: 5, scale: 2
    add_reference :products, :supplier, polymorphic: true, index: true
  end
end

List of column modifiers

Modifier Description
limit Sets the maximum size of the string/text/binary/integer fields.
precision Defines the precision for the decimal fields, representing the total number of digits in the number.
scale Defines the scale for the decimal fields, representing the number of digits after the decimal point.
polymorphic Adds a type column for belongs_to associations.
null Allows or disallows NULL values in the column.
default Allows to set a default value on the column. Note that if you are using a dynamic value (such as a date), the default will only be calculated the first time (i.e. on the date the migration is applied).
index Adds an index for the column.
comment Adds a comment for the column.