マイグレーション(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