Create Table Migration
bin/rails generate migration CreateProducts name:string price:decimal
Migration file:
class CreateProducts < ActiveRecord::Migration def change create_table :products do |t| t.string :name t.decimal :price t.timestamps end end end
Add Column Migration
To add a column to an existing table:
bin/rails generate migration AddStockToProducts stock:integer
Migration file:
class AddStockToProducts < ActiveRecord::Migration def change add_column :products, :stock, :integer end end
Remove Column Migration
To remove a column from a table:
bin/rails generate migration RemoveStockFromProducts stock:integer
Migration file:
class RemoveStockFromProducts < ActiveRecord::Migration def change remove_column :products, :stock, :integer end end
Change Column Migration
To change the type or properties of an existing column:
bin/rails generate migration ChangePriceInProducts
Migration file:
class ChangePriceInProducts < ActiveRecord::Migration def change change_column :products, :price, :float end end
Rename Column Migration
To rename an existing column:
bin/rails generate migration RenameNameInProductsToTitle
Migration file:
class RenameNameInProductsToTitle < ActiveRecord::Migration def change rename_column :products, :name, :title end end
Add Index Migration
To add an index to a column:
bin/rails generate migration AddIndexToProductsTitle
Migration file:
class AddIndexToProductsTitle < ActiveRecord::Migration def change add_index :products, :title end end
Remove Index Migration
To remove an index from a column:
bin/rails generate migration RemoveIndexFromProductsTitle
Migration file:
class RemoveIndexFromProductsTitle < ActiveRecord::Migration def change remove_index :products, :title end end
Add Reference Migration
To add a foreign key reference:
bin/rails generate migration AddUserRefToProducts user:references
Migration file:
class AddUserRefToProducts < ActiveRecord::Migration def change add_reference :products, :user, foreign_key: true end end
Remove Reference Migration
To remove a foreign key reference:
bin/rails generate migration RemoveUserRefFromProducts
Migration file:
class RemoveUserRefFromProducts < ActiveRecord::Migration def change remove_reference :products, :user, foreign_key: true end end
Create Join Table Migration
To create a join table for many-to-many relationships:
bin/rails generate migration CreateJoinTableProductsUsers products users
Migration file:
class CreateJoinTableProductsUsers < ActiveRecord::Migration def change create_join_table :products, :users do |t| t.index :product_id t.index :user_id end end end
Change Table Migration
To apply multiple changes to a table:
bin/rails generate migration UpdateProducts
Migration file:
class UpdateProducts < ActiveRecord::Migration def change change_table :products do |t| t.string :description t.rename :price, :cost end end end
Drop Table Migration
To drop an existing table:
bin/rails generate migration DropProducts
Migration file:
class DropProducts < ActiveRecord::Migration def change drop_table :products end end
Drop Join Table Migration
To drop a join table:
bin/rails generate migration DropJoinTableProductsUsers
Migration file:
class DropJoinTableProductsUsers < ActiveRecord::Migration def change drop_join_table :products, :users end end
Create View Migration
Creating views is less common but can be done like this:
bin/rails generate migration CreateActiveUsersView
Migration file:
class CreateActiveUsersView < ActiveRecord::Migration def up execute <<-SQL CREATE VIEW active_users AS SELECT * FROM users WHERE active = true SQL end def down execute <<-SQL DROP VIEW active_users SQL end end
Rollback Migration
To rollback the most recent migration:
bin/rails db:rollback
Rollback Specific Version
To rollback to a specific version:
bin/rails db:rollback VERSION=20230815123456
Migrate Specific Version
To migrate to a specific version:
bin/rails db:migrate:up VERSION=20230815123456
Migrate Redo
To redo the most recent migration (rollback and then migrate again):
bin/rails db:migrate:redo
Rollback with STEP
To rollback a specific number of steps:
bin/rails db:rollback STEP=4
Migrate with STEP
To migrate a specific number of steps:
bin/rails db:migrate STEP=4
Heroku Migrations
To run any of the above migrations on Heroku, prepend "heroku run" to any of the commands above. For example, for a simple migration:
heroku run rails db:migrate