Railsドキュメント

マイグレーション(migration)

マイグレーションとは

説明

直接SQLを使わずにデータベースのテーブルやカラムなどの構造を変更できる仕組み

簡単な例

class CreateProducts < ActiveRecord::Migration[7.0]
  def change
    create_table :products do |t|
      t.string :name
      t.text :description

      t.timestamps
    end
  end
end

昔からある記述方法

changeの代わりにupとdownで書くことも可能

class CreateProducts < ActiveRecord::Migration[7.0]
  def up
    create_table :products do |t|
      t.string :name
      t.text :description

      t.timestamps
    end
  end

  def down
    drop_table :products
  end
end

カラムをバージョンアップ

説明

データベースのカラムをバージョンアップ
upメソッドはロールバックできない処理をする際に主に使用

使い方

def up
end

def up
  create_table :pages do |t|
    t.string :name
    t.string :category
  end
end

ソースコード

カラムをバージョンダウン

説明

データベースのカラムをバージョンダウン
ロールバックできない処理の際に主に使用

使い方

def down
end

def down
  drop_table :pages
end

ソースコード

テーブルを作成

説明

テーブルを作成

使い方

create_table(テーブル名, id: ID=:primary_key, primary_key: プライマリーキー=nil, force: Force=nil, オプション引数)

オプション

オプション 説明 デフォルト値
:id 主キーを自動的に追加するか true
:primary_key 主キーの名前 :id
:options テーブルオプション  
:temporary 一時テーブルとして作成 false
:force テーブルを作成する前にドロップするか false
:if_not_exists テーブルが存在するときにエラーにしない false
:as テーブル作成時に使うSQL  

利用可能なメソッド

メソッド名 説明
t.primary_key プライマリーキーを定義
t.column 指定されたテーブルに新しいカラムを追加
t.index テーブルに新しいインデックスを追加
t.rename_index インデックスの名前を変更
t.timestamps created_atとupdated_atを両方追加するメソッド
t.change データベースのカラムを変更
t.change_default カラムに新しいデフォルト値を設定
t.change_null カラムにNOT NULL制約を設定または削除
t.rename カラムの名前を変更
t.references 既存のテーブルにリファレンスを追加
t.belongs_to referencesのエイリアス
t.check_constraint チェック制約を追加
t.string String型を定義
t.text Text型を定義
t.integer Integer型を定義
t.bigint Bigint型を定義 
t.float Float型を定義
t.decimal Decimal型を定義 
t.numeric Numeric型を定義
t.datetime Datetime型を定義
t.timestamp Timestamp型を定義
t.time Time型を定義
t.date Date型を定義
t.binary Binary型を定義
t.boolean Boolean型を定義
t.foreign_key テーブルに外部キーを追加
t.json Join型を定義
t.virtual Virtual型を定義
t.remove テーブル定義からカラムを削除
t.remove_foreign_key 外部キーをテーブルから削除 
t.remove_references リファレンスを削除
t.remove_belongs_to remove_referencesのエイリアス
t.remove_index インデックスを削除
t.remove_check_constraint チェック制約をテーブルから削除
t.remove_timestamps テーブルからタイムスタンプ列(created_at、updated_at)を削除

テーブルの作成

crate_table :products do |t|
  t.string :name
end

空のカラムを禁止

create_tabe :products |t|
  t.string :name, null: false
end

文字コードを指定してテーブルを作成

create_table :suppliers, options: 'ENGINE=InnoDB DEFAULT CHARSET=utf8'

主キーを指定してテーブルを作成

create_table(:objects, primary_key: 'guid') do |t|
  t.column :name, :string, limit: 80
end

プライマリーキーの無いテーブルを作成

create_table(:categories_suppliers, id: false) do |t|
  t.column :category_id, :integer
  t.column :supplier_id, :integer
end

メソッド詳細

t.primary_key

説明

プライマリーキーを定義

使い方
primary_key(名前, タイプ=:primary_key, オプション引数)
t.primary_key :id, :uuid, default: "uuid_generate_v4()"
ソースコード

t.column

説明

指定されたテーブルに新しいカラムを追加

使い方
column(カラム名, 型, index: インデックス=nil, オプション引数)
t.column(:name, :string)
ソースコード

t.index

説明

テーブルに新しいインデックスを追加

使い方
index(カラム名, オプション引数)
t.index(:name)
t.index([:branch_id, :party_id], unique: true)
t.index([:branch_id, :party_id], unique: true, name: 'by_branch_party')
ソースコード

t.rename_index

説明

インデックスの名前を変更

使い方
rename_index(インデックス名, 新しいインデックス名)
t.rename_index(:user_id, :account_id)
ソースコード

t.timestamps

説明

created_atとupdated_atを両方追加するメソッド

使い方
timestamps(オプション引数)
usersテーブルにtimestampsを設定
create_table :users do |t|
  t.timestamps
end
ソースコード

t.change

説明

データベースのカラムを変更

使い方
change(カラム名, 型, オプション引数)
オプション
オプション 説明 デフォルト値
:limit カラムの桁数を指定  
:default デフォルト値を指定  
:null NULL値を許可するか true
:precision :decimal、:numeric、:datetime、および:time型の精度を指定  
:scale :decimal、:numeric型の小数点以下の桁数  
:collation :stringまたは:textの照合順序を指定  
:comment カラムのコメントを指定。データベース管理ツールなどで閲覧が可能  
データベースのカラムを変更
t.change(:description, :text)
カラムの桁数を指定して変更
t.change(:name, :string, limit: 80)
ソースコード

t.change_default

説明

カラムに新しいデフォルト値を設定

使い方
change_default(カラム, デフォルト値)
t.change_default(:qualification, 'new')
t.change_default(:authorized, 1)
t.change_default(:status, from: nil, to: "draft")
ソースコード

t.change_null

説明

カラムにNOT NULL制約を設定または削除

使い方
change_null(カラム, NULL, デフォルト値=nil)
t.change_null(:qualification, true)
t.change_null(:qualification, false, 0)
ソースコード

t.rename

説明

カラムの名前を変更

使い方
rename(カラム名, 新しいカラム名)
t.rename(:description, :name)
ソースコード

t.references

説明

既存のテーブルにリファレンスを追加

使い方
references(カラム名 [, オプション])
オプション
オプション 説明 デフォルト値
:type カラムタイプ :bigint
:index インデックスを付与 true
:foreign_key 外部キーの制約 false
:polymorphic ポリモーフィックを付与 false
:null NULLを許可するか true
t.references(:user)
ソースコード

t.check_constraint

説明

チェック制約を追加

使い方
check_constraint(引数..)
t.check_constraint("price > 0", name: "price_check")
ソースコード

t.string

説明

String型を定義

使い方
t.string(カラム名)
t.string(:name)

t.text

説明

Text型を定義

使い方
t.text(カラム名)
t.text(:name)

t.integer

説明

Integer型を定義

使い方
t.integer(カラム名)
t.integer(:age)

t.bigint

説明

Bigint型を定義

使い方
t.bigint(カラム名)
t.bigint(:num)

t.float

説明

Float型を定義

使い方
t.float(カラム名)
t.float(:num)

t.decimal

説明

Decimal型を定義

使い方
t.decimal(カラム名)
t.decimal(:num)

t.numeric

説明

Numeric型を定義

使い方
t.numeric(カラム名)
t.numeric(:num)

t.datetime

説明

Datetime型を定義

使い方
t.datetime(カラム名)
t.datetime(:time)

t.timestamp

説明

Timestamp型を定義

使い方
t.timestamp(カラム名)
t.timestamp(:time)

t.time

説明

Time型を定義

使い方
t.time(カラム名)
t.time(:time)

t.date

説明

Date型を定義

使い方
t.date(カラム名)
t.date(:date)

t.binary

説明

Binary型を定義

使い方
t.binary(カラム名)
t.binary(:image)

t.boolean

説明

Boolean型を定義

使い方
t.boolean(カラム名)
t.boolean(:flag)

t.foreign_key

説明

テーブルに外部キーを追加

使い方
foreign_key(引数, オプション引数)
t.foreign_key(:authors)
t.foreign_key(:authors, column: :author_id, primary_key: "id")
ソースコード

t.json

説明

Json型を定義

使い方
t.json(カラム名)
t.json(:request)

t.virtual

説明

Virtual型を定義

使い方
t.virtual(カラム名)
t.virtual(:hoge)

t.remove

説明

テーブル定義からカラムを削除

使い方
remove(カラム名.., オプション引数)
t.remove(:qualification)
t.remove(:qualification, :experience)
ソースコード

t.remove_foreign_key

説明

外部キーをテーブルから削除

使い方
remove_foreign_key(外部キー.., オプション引数)
t.remove_foreign_key(:authors)
t.remove_foreign_key(column: :author_id)
ソースコード

t.remove_references

説明

リファレンスを削除

使い方
remove_reference(テーブル名, リファレンス名, foreign_key: 外部キー=false, polymorphic: ポリモーフィック=false, オプション引数)
t.remove_references(:user)
ソースコード

t.remove_index

説明

インデックスを削除

使い方
t.rremove_index(カラム名=nil, オプション引数)
t.remove_index(:user)
ソースコード

t.remove_check_constraint

説明

チェック制約をテーブルから削除

使い方
t.remove_check_constraint(引数..)
t.remove_check_constraint(name: "price_check")
ソースコード

t.remove_timestamps

説明

テーブルからタイムスタンプ列(created_at、updated_at)を削除

使い方

t.remove_timestamps(オプション引数)

t.remove_timestamps
ソースコード

テーブル定義を変更

説明

テーブル定義を変更

使い方

change_table(テーブル名, オプション引数)

オプション

オプション 説明 デフォルト値
:bulk 変更内容を1つのALTER TABLEにまとめるか false

利用可能なメソッド

メソッド名 説明
t.primary_key プライマリーキーを定義
t.column 指定されたテーブルに新しいカラムを追加
t.index テーブルに新しいインデックスを追加
t.rename_index インデックスの名前を変更
t.timestamps created_atとupdated_atを両方追加するメソッド
t.change データベースのカラムを変更
t.change_default カラムに新しいデフォルト値を設定
t.change_null カラムにNOT NULL制約を設定または削除
t.rename カラムの名前を変更
t.references 既存のテーブルにリファレンスを追加
t.belongs_to referencesのエイリアス
t.check_constraint チェック制約を追加
t.string String型を定義
t.text Text型を定義
t.integer Integer型を定義
t.bigint Bigint型を定義 
t.float Float型を定義
t.decimal Decimal型を定義 
t.numeric Numeric型を定義
t.datetime Datetime型を定義
t.timestamp Timestamp型を定義
t.time Time型を定義
t.date Date型を定義
t.binary Binary型を定義
t.boolean Boolean型を定義
t.foreign_key テーブルに外部キーを追加
t.json Join型を定義
t.virtual Virtual型を定義
t.remove テーブル定義からカラムを削除
t.remove_foreign_key 外部キーをテーブルから削除 
t.remove_references リファレンスを削除
t.remove_belongs_to remove_referencesのエイリアス
t.remove_index インデックスを削除
t.remove_check_constraint チェック制約をテーブルから削除
t.remove_timestamps テーブルからタイムスタンプ列(created_at、updated_at)を削除

pagesテーブルにtext型のmemoを追加、titleにインデックスを設定

change_table :pages do |t|
  t.text :memo
  t.index :title
end

カラムの追加

change_table(:suppliers) do |t|
  t.column :name, :string, limit: 60
end

2つのカラムの追加

change_table(:suppliers) do |t|
  t.integer :width, :height, null: false, default: 0
end

タイムスタンプを追加

change_table(:suppliers) do |t|
  t.timestamps
end

外部キーを追加

change_table(:suppliers) do |t|
  t.references :company
end

複数カラムの削除

change_table(:suppliers) do |t|
  t.remove :company_id
  t.remove :width, :height
end

インデックスを削除

change_table(:suppliers) do |t|
  t.remove_index :company_id
end

メソッド詳細

t.primary_key

説明

プライマリーキーを定義

使い方
primary_key(名前, タイプ=:primary_key, オプション引数)
t.primary_key :id, :uuid, default: "uuid_generate_v4()"
ソースコード

t.column

説明

指定されたテーブルに新しいカラムを追加

使い方
column(カラム名, 型, index: インデックス=nil, オプション引数)
t.column(:name, :string)
ソースコード

t.index

説明

テーブルに新しいインデックスを追加

使い方
index(カラム名, オプション引数)
t.index(:name)
t.index([:branch_id, :party_id], unique: true)
t.index([:branch_id, :party_id], unique: true, name: 'by_branch_party')
ソースコード

t.rename_index

説明

インデックスの名前を変更

使い方
rename_index(インデックス名, 新しいインデックス名)
t.rename_index(:user_id, :account_id)
ソースコード

t.timestamps

説明

created_atとupdated_atを両方追加するメソッド

使い方
timestamps(オプション引数)
usersテーブルにtimestampsを設定
create_table :users do |t|
  t.timestamps
end
ソースコード

t.change

説明

データベースのカラムを変更

使い方
change(カラム名, 型, オプション引数)
オプション
オプション 説明 デフォルト値
:limit カラムの桁数を指定  
:default デフォルト値を指定  
:null NULL値を許可するか true
:precision :decimal、:numeric、:datetime、および:time型の精度を指定  
:scale :decimal、:numeric型の小数点以下の桁数  
:collation :stringまたは:textの照合順序を指定  
:comment カラムのコメントを指定。データベース管理ツールなどで閲覧が可能  
データベースのカラムを変更
t.change(:description, :text)
カラムの桁数を指定して変更
t.change(:name, :string, limit: 80)
ソースコード

t.change_default

説明

カラムに新しいデフォルト値を設定

使い方
change_default(カラム, デフォルト値)
t.change_default(:qualification, 'new')
t.change_default(:authorized, 1)
t.change_default(:status, from: nil, to: "draft")
ソースコード

t.change_null

説明

カラムにNOT NULL制約を設定または削除

使い方
change_null(カラム, NULL, デフォルト値=nil)
t.change_null(:qualification, true)
t.change_null(:qualification, false, 0)
ソースコード

t.rename

説明

カラムの名前を変更

使い方
rename(カラム名, 新しいカラム名)
t.rename(:description, :name)
ソースコード

t.references

説明

既存のテーブルにリファレンスを追加

使い方
references(カラム名 [, オプション])
オプション
オプション 説明 デフォルト値
:type カラムタイプ :bigint
:index インデックスを付与 true
:foreign_key 外部キーの制約 false
:polymorphic ポリモーフィックを付与 false
:null NULLを許可するか true
t.references(:user)
ソースコード

t.check_constraint

説明

チェック制約を追加

使い方
check_constraint(引数..)
t.check_constraint("price > 0", name: "price_check")
ソースコード

t.string

説明

String型を定義

使い方
t.string(カラム名)
t.string(:name)

t.text

説明

Text型を定義

使い方
t.text(カラム名)
t.text(:name)

t.integer

説明

Integer型を定義

使い方
t.integer(カラム名)
t.integer(:age)

t.bigint

説明

Bigint型を定義

使い方
t.bigint(カラム名)
t.bigint(:num)

t.float

説明

Float型を定義

使い方
t.float(カラム名)
t.float(:num)

t.decimal

説明

Decimal型を定義

使い方
t.decimal(カラム名)
t.decimal(:num)

t.numeric

説明

Numeric型を定義

使い方
t.numeric(カラム名)
t.numeric(:num)

t.datetime

説明

Datetime型を定義

使い方
t.datetime(カラム名)
t.datetime(:time)

t.timestamp

説明

Timestamp型を定義

使い方
t.timestamp(カラム名)
t.timestamp(:time)

t.time

説明

Time型を定義

使い方
t.time(カラム名)
t.time(:time)

t.date

説明

Date型を定義

使い方
t.date(カラム名)
t.date(:date)

t.binary

説明

Binary型を定義

使い方
t.binary(カラム名)
t.binary(:image)

t.boolean

説明

Boolean型を定義

使い方
t.boolean(カラム名)
t.boolean(:flag)

t.foreign_key

説明

テーブルに外部キーを追加

使い方
foreign_key(引数, オプション引数)
t.foreign_key(:authors)
t.foreign_key(:authors, column: :author_id, primary_key: "id")
ソースコード

t.json

説明

Json型を定義

使い方
t.json(カラム名)
t.json(:request)

t.virtual

説明

Virtual型を定義

使い方
t.virtual(カラム名)
t.virtual(:hoge)

t.remove

説明

テーブル定義からカラムを削除

使い方
remove(カラム名.., オプション引数)
t.remove(:qualification)
t.remove(:qualification, :experience)
ソースコード

t.remove_foreign_key

説明

外部キーをテーブルから削除

使い方
remove_foreign_key(外部キー.., オプション引数)
t.remove_foreign_key(:authors)
t.remove_foreign_key(column: :author_id)
ソースコード

t.remove_references

説明

リファレンスを削除

使い方
remove_reference(テーブル名, リファレンス名, foreign_key: 外部キー=false, polymorphic: ポリモーフィック=false, オプション引数)
t.remove_references(:user)
ソースコード

t.remove_index

説明

インデックスを削除

使い方
t.rremove_index(カラム名=nil, オプション引数)
t.remove_index(:user)
ソースコード

t.remove_check_constraint

説明

チェック制約をテーブルから削除

使い方
t.remove_check_constraint(引数..)
t.remove_check_constraint(name: "price_check")
ソースコード

t.remove_timestamps

説明

テーブルからタイムスタンプ列(created_at、updated_at)を削除

使い方

t.remove_timestamps(オプション引数)

t.remove_timestamps
ソースコード

テーブルを結合して作成

説明

2つのテーブルを結合して新しいテーブルを作成

使い方

create_join_table(テーブル名1, テーブル名2, column_options: カラムオプション={}, オプション引数)

オプション

オプション 説明
:table_name テーブルの名前
:column_options カラムのオプション
:options オプション
:temporary 一時テーブルとして作成
:force テーブルを作成前に、既存のテーブルを削除

2つのテーブルを結合して新しいテーブルを作成

create_join_table(:assemblies, :parts, options: 'ENGINE=InnoDB DEFAULT CHARSET=utf8')

ブロック指定

create_join_table :assemblies, :parts do |t|
  t.index :assemblie_id
  t.index :part_id
end

ソースコード

テーブル名を変更

説明

指定したテーブルの名前を変更

使い方

rename_table(テーブル名, 新しいテーブル名)

rename_table :now_table, :new_table

ソースコード

テーブルを削除

説明

指定したテーブルを削除

使い方

drop_table(:テーブル名, オプション引数)

オプション

オプション 説明 デフォルト値
:force 依存も削除 false
:if_exists 存在する場合のみ削除 false
:temporary 一時テーブルを削除 false

productsテーブルを削除

drop_table :products

依存も削除

drop_table :care_reasons, force: :cascade

存在する場合のみ削除

drop_table :article_attributes, if_exists: true

ソースコード

結合テーブルを削除

説明

結合テーブルを削除

使い方

drop_join_table(テーブル1, テーブル2, オプション引数)

オプション

オプション 説明
:table_name テーブルの名前
:column_options カラムのオプション
:options オプション
:temporary 一時テーブルとして作成
:force テーブルを作成前に、既存のテーブルを削除

結合テーブルを削除

drop_join_table(:assemblies, :parts)

オプション指定

drop_join_table(:assemblies, :parts, options: 'ENGINE=InnoDB DEFAULT CHARSET=utf8')

ソースコード

指定したテーブルが存在するかチェック

説明

テーブルが存在するかチェック

使い方

table_exists?(テーブル名)

table_exists?(:developers)

ソースコード

テーブルに新しい制約を追加

説明

テーブルに新しい制約を追加

使い方

add_check_constraint(テーブル名, 条件, オプション引数)

オプション

名前 説明 デフォルト値
:name 制約の名前  
:validate 制約の検証を行うか(PostgreSQLのみ) true

制約の名前をつけてテーブルに新しい制約を追加

add_check_constraint :products, "price > 0", name: "price_check"

制約の検証をスキップ

add_check_constraint :plans, "name IS NOT NULL", name: "plans_name_null", validate: false

ソースコード

指定された制約をテーブルから削除

説明

指定された制約をテーブルから削除

使い方

remove_check_constraint(テーブル名, 制約=nil, オプション引数)

remove_check_constraint :products, name: "price_check"

ソースコード

テーブルのコメントを変更

説明

テーブルのコメントの変更または削除

使い方

change_table_comment(テーブル名, コメント)

テーブルのコメントの変更

change_table_comment :posts, from: "old_comment", to: "new_comment"

テーブルのコメントの削除

change_table_comment :posts, nil

ソースコード

カラムを追加

説明

指定したテーブルにカラムを追加

使い方

add_column(テーブル名 カラム名, タイプ, オプション引数)

オプション

オプション 説明
:comment カラムのコメントを指定。データベース管理ツールなどで閲覧が可能
:collation :stringまたは:textの照合順序を指定
:default デフォルト値を指定
:limit カラムの桁数を指定
:null NULL値を許可するか
:precision :decimal、:numeric、:datetime、および:time型の精度を指定
:scale :decimal、:numeric型の小数点以下の桁数
:if_not_exists カラムがすでに存在している場合は再追加を行わないように指定

precisionとscaleについては、データベースによって差があるので注意が必要

タイプ

タイプ 説明
:primary_key プライマリーキー
:string 文字列型
:text テキスト型
:integer 整数型(4バイト)
:bigint 整数型(8バイト)
:float 浮動小数点数
:decimal 固定長整数型
:numeric 数値型
:datetime 日付と時刻(1000-01-01 00:00:00.000000から9999-12-31 23:59:59.999999)
:time 時刻 (-838:59:59から838:59:59)
:date 日付(1000-01-01から9999-12-31)
:binary バイナリ文字列型
:blob Blob
:boolean 真偽値型

上記以外のデータベース特有のタイプも指定できるが、非推奨

カラムの追加

add_column :users, :group_id, :integer

カラムの桁数を指定

add_column :users, :picture, :binary, limit: 2.megabytes
# ALTER TABLE "users" ADD "picture" blob(2097152)

NULLを許可しない

add_column :articles, :status, :string, limit: 20, default: 'draft', null: false
# ALTER TABLE "articles" ADD "status" varchar(20) DEFAULT 'draft' NOT NULL

配列を指定

add_column :users, :skills, :text, array: true
# ALTER TABLE "users" ADD "skills" text[]

固定長整数型を指定

add_column :answers, :bill_gates_money, :decimal, precision: 15, scale: 2
# ALTER TABLE "answers" ADD "bill_gates_money" decimal(15,2)

データベース固有のかたを指定

add_column :shapes, :triangle, 'polygon'
# ALTER TABLE "shapes" ADD "triangle" polygon

カラムが存在する場合はメソッドコールを無視

add_column(:shapes, :triangle, 'polygon', if_not_exists: true)

ソースコード

カラム定義を変更

説明

既存のカラムの定義を変更

使い方

change_column(テーブル名,  カラム名, 型, オプション引数)

オプション

オプション 説明
:limit カラムの桁数を指定
:default デフォルト値を指定
:null NULL値を許可するか
:precision :decimal 型の精度を指定
:scale :decimal 型の小数点以下の桁数
:collation :stringまたは:textの照合順序を指定
:comment カラムのコメントを指定。データベース管理ツールなどで閲覧が可能

precisionとscaleについては、データベースによって差があるので注意が必要

usersテーブルのnameカラムをtext型に変更

change_column(:users, :name, :text)

文字数の最大を80に変更

change_column(:users, :name, :string, limit: 80)

null側を許可しないように変更

change_column(:users, :name, :string, null: dalse)

ソースコード

カラム名を変更

説明

指定したテーブルのカラム名を変更
名前を変更しても、そのカラムに関連付けられている既存のデータは破棄されない

使い方

rename_column(テーブル名, 変更するカラム名, 新しいカラム名)

rename_column :suppliers, :description, :name

ソースコード

カラムを削除

説明

指定したテーブルのカラムを削除

使い方

remove_column(テーブル名, カラム名, 型=nil, オプション引数)

オプション

オプション 説明 デフォルト値
:limit カラムの桁数を指定  
:default デフォルト値を指定  
:null NULL値を許可するか true
:precision :decimal、:numeric、:datetime、および:time型の精度を指定  
:scale :decimal、:numeric型の小数点以下の桁数  
:collation :stringまたは;textの照合順序を指定  
:comment カラムのコメントを指定。データベース管理ツールなどで閲覧が可能  

precisionとscaleについては、データベースによって差があるので注意が必要

カラムを削除

remove_column :users, :description

カラムの桁数を指定

remove_column :users, :description, :string, limit: 20

ソースコード

複数のカラムを削除

説明

指定したテーブルの複数のカラムを削除

使い方

remove_columns(テーブル名, カラム名.., type: 型=nil, オプション引数)

remove_columns(:suppliers, :qualification, :experience)

ソースコード

カラムの初期値を設定

説明

カラムの初期値を設定

使い方

change_column_default(テーブル名, カラム名, デフォルト値)

カラムの初期値を設定

change_column_default(:suppliers, :qualification, 'new')

カラムの初期値設定を削除

change_column_default(:users, :email, nil)

ソースコード

カラムのコメントを変更

説明

カラムのコメントを変更または削除

使い方

change_column_comment(テーブル名, カラム名, comment_or_changes)

カラムのコメントを変更

change_column_comment :posts, :state, from: "old_comment", to: "new_comment"

カラムのコメントを削除

change_column_comment :posts, :state, nil

ソースコード

NULL制約の追加または削除

説明

NULL制約の追加または削除

使い方

change_column_null(テーブル名, カラム名, NULL, デフォルト値=nil)

追加

change_column_null(:users, :nickname, false)

削除

change_column_null(:users, :nickname, true)

既存のNULLを空文字に置き換えてNULL制約を追加

change_column_null(:users, :nickname, false, "")

ソースコード

カラムが存在するかチェック

説明

指定したテーブルにカラムが存在するかチェック

使い方

column_exists?(テーブル名, カラム名, 型=nil, オプション引数)

オプション

オプション 説明 デフォルト値
:limit カラムの桁数を指定  
:default デフォルト値を指定  
:null NULL値を許可するか true
:precision :decimal、:numeric、:datetime、および:time型の精度を指定  
:scale :decimal、:numeric型の小数点以下の桁数  
:collation :stringまたは;textの照合順序を指定  
:comment カラムのコメントを指定。データベース管理ツールなどで閲覧が可能  

pagesテーブルのtitleカラムが存在するか

column_exists? :pages, :title

suppliersテーブルのnameカラムのstring型が存在するか

column_exists? :suppliers, :name, :string

NULLを許可しない

column_exists?(:suppliers, :name, :string, null: false)

ソースコード

インデックスを追加

説明

指定したテーブルにインデックスを追加

使い方

add_index(テーブル名, インデックスを付与するカラム名, オプション引数)

オプション

オプション 説明 データベースの種類
:name インデックスの名前 全て
:if_not_exists カラムがすでに存在している場合は再追加を行わないように指定 全て
:unique trueを指定するとユニークなインデックス 全て
:length インデックスに含まれるカラムの長さ 全て
:order ソート順 MySQL
:where 部分インデックス PostgreSQL、SQLite
:using 特定の方法のインデックス PostgreSQL、MySQL
:opclass 特定の演算子クラスのインデックス PostgreSQL
:type 特定のタイプのインデックス MySQL
:algorithm 特定のアルゴリズムのインデックス PostgreSQL

usersテーブルのnameカラムのインデックスを作成

add_index :users, :name

ユニークなインデックスを作成

add_index :users, [:name, :employee_id], unique: true

インデックス名をつけて作成

add_index :users, [:name, :employee_id], unique: true, name: 'by_branch_name'

インデックスの長さを10に指定して作成

add_index :users, :name, name: 'by_name', length: 10

複数のキーで長さを指定

add_index :accounts, [:name, :surname], name: 'by_name_surname', length: {name: 10, surname: 15}

ソート順でインデックスを作成

add_index :accounts, [:branch_id, :party_id, :surname], order: {branch_id: :desc, party_id: :asc}

部分インデックスの作成

add_index :accounts, [:branch_id, :party_id], unique: true, where: "active"

特定の方法でインデックスを作成

add_index :developers, :name, using: 'btree'

特定の演算子クラスでインデックスを作成

add_index :developers, :name, using: 'gist', opclass: :gist_trgm_ops

特定のタイプのインデックスを作成

add_index :developers, :name, type: :fulltext

特定のアルゴリズムでインデックスを作成

add_index :developers, :name, algorithm: :concurrently

ソースコード

インデックスが存在するか

説明

インデックスが存在するか

使い方

index_exists?(カラム名, オプション={})

unless t.index_exists?(:branch_id)
    t.index(:branch_id)
end

ソースコード

インデックスを変更

説明

指定したテーブルのインデックスを変更

使い方

rename_index(テーブル名, 変更前の名前, 変更後の名前)

rename_index :people, 'index_people_on_last_name', 'index_users_on_last_name'

ソースコード

インデックスを削除

説明

指定したテーブルのインデックスを削除

使い方

remove_index(テーブル名, カラム名=nil, オプション引数)

オプション

オプション 説明
:name インデックス名
:column カラム名
:algorithm 特定のアルゴリズムのインデックス

インデックスを削除

remove_index :users, :name

カラム名を指定

remove_index :accounts, column: :branch_id

カラム名を複数指定

remove_index :accounts, column: [:branch_id, :party_id]

インデックス名を指定

remove_index :accounts, name: :by_branch_party

特定のアルゴリズムのインデックスを指定

remove_index :accounts, name: :by_branch_party, algorithm: :concurrently

ソースコード

インデックスが存在するかチェック

説明

指定したテーブルにインデックスが存在するか

使い方

index_exists?(テーブル名, カラム名, オプション引数)

オプション

オプション 説明
:name インデックスの名前
:unique trueを指定するとユニークなインデックス
:length インデックスに含まれるカラムの長さ

pagesテーブルのtitleカラムにインデックスが存在するか

index_exists? :pages, :title

複数カラムを指定

index_exists?(:suppliers, [:company_id, :company_type]

ユニークなインデックス

index_exists?(:suppliers, :company_id, unique: true)

インデックス名を指定

index_exists?(:suppliers, :company_id, name: "idx_company_id")

ソースコード

テーブルに指定した名前のインデックスが存在するかチェック

説明

テーブルに指定した名前のインデックスが存在するか

使い方

index_name_exists?(テーブル名, インデックス名)

index_name_exists?(:pages, :title)

ソースコード

リファレンスを追加

説明

指定したテーブルにリファレンスを追加

使い方

add_reference(テーブル名, リファレンス名, オプション引数)

オプション

オプション 説明 デフォルト値
:type カラムタイプ :bigint
:index インデックスを付与 true
:foreign_key 外部キーの制約 false
:polymorphic ポリモーフィックを付与 false
:null NULLを許可するか true

リファレンスを追加

add_reference(:products, :user)

文字列で作成

add_reference(:products, :user, type: :string)

ユニークなインデックス

add_reference(:products, :supplier, index: { unique: true })

NULLを許可しない

add_reference(:products, :user, null: false)

外部キー指定

add_reference(:products, :supplier, foreign_key: true)

ソースコード

リファレンスを削除

説明

既存のテーブルのリファレンスを削除

使い方

remove_reference(テーブル名, リファレンス名 [, オプション])

オプション

オプション 説明
:polymorphic ポリモーフィックを付与
:index インデックスを付与
:foreign_key 外部キーの制約

既存のテーブルのリファレンスを削除

remove_reference(:products, :user, index: true)

ポリモーフィックを付与

remove_reference(:products, :supplier, polymorphic: true)

外部キーの制約を指定

remove_reference(:products, :user, foreign_key: true)

ソースコード

テーブルに外部キーを追加

説明

外部キーが存在するか

使い方

foreign_key_exists?(参照元テーブル, 参照先テーブル=nil, オプション引数)

t.foreign_key(:authors) unless t.foreign_key_exists?(:authors)

ソースコード

テーブルから指定された外部キーを削除

説明

テーブルから指定された外部キーを削除

使い方

remove_foreign_key(テーブル名, 参照先テーブル名=nil, オプション引数)

オプション

名前 説明
:to_table 参照される主キーを含むテーブル名

外部キーを削除

remove_foreign_key :accounts, :branches

主キーを含むテーブル名を指定

remove_foreign_key :accounts, to_table: :owners

名前を指定

remove_foreign_key :accounts, name: :special_fk_name

外部キーが存在するかどうかをチェックしてから削除

remove_foreign_key :accounts, :branches, if_exists: true

ソースコード

タイムスタンプを追加

説明

既存のテーブルにタイムスタンプ(created_atとupdated_at)を追加

使い方

add_timestamps(テーブル名, オプション引数)

オプション

オプション 説明 デフォルト値
:limit カラムの桁数を指定  
:default デフォルト値を指定  
:null NULL値を許可するか false
:precision :decimal、:numeric、:datetime、および:time型の精度を指定  
:scale :decimal、:numeric型の小数点以下の桁数  
:collation :stringまたは;textの照合順序を指定  
:comment カラムのコメントを指定。データベース管理ツールなどで閲覧が可能  
:if_not_exists カラムがすでに存在している場合は再追加を行わないように指定  

created_atとupdated_atを追加

add_timestamps :users

NULLを許可

add_timestamps :suppliers, null: true

ソースコード

created_atとupdated_atの削除

説明

指定したテーブルのcreated_atとupdated_atを削除

使い方

remove_timestamps(テーブル名, オプション引数)

remove_timestamps(:users)

ソースコード

データソース名がデータベース上に存在するか

説明

データソース名がデータベース上に存在するか

使い方

data_source_exists?(名前)

data_source_exists?(:ebooks)

ソースコード

指定したビュー名ががデータベース上に存在するかチェック

説明

指定したビュー名ががデータベース上に存在するかチェック

使い方

モデル.exists?(条件=:none)

view_exists?(:ebooks)

ソースコード

マイグレーションファイルでSQLを実行

説明

マイグレーションファイルでSQLを実行

使い方

execute(SQL文, 名前=nil)

execute "SELECT * FROM pages ORDER BY updated_at DESC LIMIT 10"

ソースコード

ロールバックする方法がわからない処理

説明

ロールバックする方法がわからない処理

使い方

reversible()

class SplitNameMigration < ActiveRecord::Migration[7.0]
    def change
        add_column :users, :first_name, :string
        add_column :users, :last_name, :string

        reversible do |dir|
            User.reset_column_information
            User.all.each do |u|
                dir.up   { u.first_name, u.last_name = u.full_name.split(' ') }
                dir.down { u.full_name = "#{u.first_name} #{u.last_name}" }
                u.save
            end
        end

        revert { add_column :users, :full_name, :string }
    end
end

ソースコード

リバート

説明

マイグレーションのロールバック

使い方

revert(マイグレーションクラス.., ブロック引数)

class FixTLMigration < ActiveRecord::Migration[7.0]
    def change
        revert do
            create_table(:horses) do |t|
                t.text :content
                t.datetime :remind_at
            end
        end
        create_table(:apples) do |t|
            t.string :variety
        end
    end
end

ソースコード

マイグレーションアップ時にのみ実行される処理

説明

マイグレーションアップ時にのみ実行される処理

使い方

up_only(ブロック引数)

class AddPublishedToPosts < ActiveRecord::Migration[7.0]
    def change
        add_column :posts, :published, :boolean, default: false
        up_only do
            execute "update posts set published = 'true'"
        end
    end
end

ソースコード