Skip to content

Instantly share code, notes, and snippets.

@wbotelhos
Last active January 5, 2021 18:22
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save wbotelhos/53e16023dbfde680f7bec93ecaf2267e to your computer and use it in GitHub Desktop.
Save wbotelhos/53e16023dbfde680f7bec93ecaf2267e to your computer and use it in GitHub Desktop.
Rails Schema Migration Cheat Sheet

Migration

add_column :table_name, :column_name, :decimal, default: 0, precision: 15, scale: 10
add_column :table_name, :column_name, :jsonb, default: {}, null: false
add_column :table_name, :column_name, :string, array: true, default: []

add_foreign_key :table_name, :table_name
add_foreign_key :table_name, :table_name, column: :column_name, name: :index_table_name_on_column_name

add_index :table_name, %i[column_name_1 column_name_2], order: { column_name: :desc }, unique: true, where: 'column_name IS NOT NULL', name: :index_name

add_reference :table_name, :custom_name, foreign_key: { to_table: :table_name }, index: true, null: false
add_reference :table_name, :model_name, foreign_key: true, index: true, null: false

add_timestamps :table_name

change_column :table_name, :column_name, :new_type
change_column :table_name, :column_name, :string, limit: 9
change_column :table_name, :column_name, 'integer USING CAST("column_name" AS integer)'
change_column_default :table_name, :locked, true # nil to drop default
change_column_null :table_name, :column_name, false

drop_table :table_name

enable_extension 'citext'
execute 'update users set confirmed_at = now()'

remove_column :table_name, :column_name, :string
remove_foreign_key :table_name, name: :foreign_key_name
remove_index :table_name, %i[column_name_1 column_name_2]
remove_index :table_name, name: :index_name
remove_reference :table_name, :model_name
rename_column :table_name, :old_column, :new_column
rename_table :table_name, :new_table_name

t.timestamps

t.references :model_name, foreign_key: true, index: true, null: false
t.references :model_name, foreign_key: true, index: { name: :index_table_field, unique: true }, null: false
t.references :custom_name, foreign_key: { to_table: :table_name }, index: true, null: false
t.references :ticketable, polymorphic: true, index: true

# atomic add fields

change_table :table_name, bulk: true do |t|
  t.index  :useful_foreign_key
  t.string :summary
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment