Automatically make migrations

$ rails generate migration RemovePartNumberFromProducts part_number:string
$ rails generate migration remove_part_number_from_products part_number # rails assumes string if not type given - and you can use snake_case

$ rails generate migration AddNameToWidgets name:string
$ rails g migration add_name_to_widgets name:string # you can use the short cut 'g' instead of generate - they both do the same thing

Run migrations

$ rake db:migrate

Creating tables

create_table :users do |t|
  t.string :name
  t.text   :description

  t.primary_key :id
  t.string      :title
  t.text        :description
  t.integer     :games_count
  t.float       :lol
  t.decimal     :price
  t.decimal     :price, :precision => 2, :scale => 10
  t.datetime    :expiration
  t.timestamp   :time_in
  t.time        :time_in
  t.date        :expiry
  t.binary      :image_data
  t.boolean     :is_admin
end

# Options:
  :null (boolean)
  :limit (integer)
  :default

Operations

add_column    :users, :first_name, :string
remove_column :users, :first_name, :string

change_column :users, :first_name, :text
change_column :users, :first_name, :text

change_column_default :users, :admin, nil
change_column_null    :users, :email, false # adds NOT NULL constraint

create_table
change_table
drop_table

add_column
change_column
rename_column
remove_column

add_index
remove_index

Use models

class AddFlagToProduct < ActiveRecord::Migration
  class Product < ActiveRecord::Base
  end
 
  def change
    add_column :products, :flag, :boolean
    Product.reset_column_information
    reversible do |dir|
      dir.up { Product.update_all flag: false }
    end
  end
end

Associations

t.references :category   # kinda same as t.integer :category_id

# Can have different types
t.references :category, polymorphic: true

Auto-Add/remove columns

$ rails generate migration RemovePartNumberFromProducts part_number:string

Indices

# Simple
add_index :suppliers, :name

# Unique
add_index :accounts, [:branch_id, :party_id], :unique => true

# Named (:name => ...)
add_index :accounts, [:branch_id, :party_id], :unique => true, :name => "by_branch_party"

# Length
add_index :accounts, :name, :name => ‘by_name’, :length => 10
add_index :accounts, [:name, :surname], :name => ‘by_name_surname’,
  :length => {
    :name => 10,
    :surname => 15
  }

# Sort order (no MySQL support)
add_index :accounts, [:branch_id, :party_id, :surname],
  :order => {:branch_id => :desc, :part_id => :asc}

In console

Use ActiveRecord::Migration.

ActiveRecord::Migration.add_index :posts, :slug

References

  • http://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/add_index