マイグレーション

参考:

Active Record マイグレーション | Rails ガイド [公式]

DBマイグレーション | Rails日本語ドキュメント (Ruby STUDIO)

マイグレーション(migration) | Rails ドキュメント (railsdoc.com)

rake db:migrate | Rails ドキュメント (railsdoc.com)

Rails の migration の基本とレシピ集 | Rails Webook

migrate するときめも – Qiita

Rails のマイグレーションクラスの命名ルール | kzy52’s blog

まとめ

参考:

rails generate migration コマンドまとめ – Qiita

マイグレーションを使ったカラムの変更方法まとめ – Qiita

マイグレーションの操作

マイグレーションの状態を確認する。

$ rails db:migrate:status

マイグレーションを実行する。(未実行のものを全て実行する。)

$ rails db:migrate

ロールバックする。(一番最後のマイグレーションを一つ取り消す。)

$ rails db:rollback

参考:

rails の migration の実行状況と戻す方法 – Qiita

rake db: migrate を rollback で元に戻す | deadwood

rake db:rollback したい時の間違えない手順 | 主婦がアプリをリリースするまでの軌跡

マイグレーションのロールバック | Ruby on Rails 入門 (www.javadrive.jp)

マイグレーションをロールバックしたい | teratail

migration ファイルでカラムを追加/削除しても schema.rb に反映しないのはなぜか – スタック・オーバーフロー

特定のマイグレーションを取り消し (ロールバック) する

マイグレーションのバージョン番号 (生成日時による ID) を指定してロールバックする。

$ rails db:migrate:down VERSION=201806xx120345

参考:

特定のマイグレーションのみを実行する | Rails ガイド [公式]

rake db:rollback | Rails ドキュメント (railsdoc.com)

How to rollback a specific migration? – Stack Overflow

カラムの名前を変更する (カラムのリネーム)

マイグレーションを生成する。

$ rails g migration RenameTableNameOldNameToNewName

マイグレーションを編集する。

class RenameTableNameOldNameToNewName < ActiveRecord::Migration[5.2]
  def change
    rename_column :table_name, :old_name, :new_name
  end
end

マイグレーションを実行する。

$ rails db:migrate

参考:

カラム名を変更する方法 – Qiita

column 名を変更 – Qiita

カラム名変更する方法 | 本厚木のエンジニアブログではある

Rails で DB のカラム名を変更する | 千鳥足プログラマーの歩む道@shimosuk

rename_column | Rails ドキュメント (railsdoc.com)

Rename a Column on a Database in a Migration | Codkal

Renaming a Database Column in Ruby on Rails | RichOnRails.com

rename_column – ActiveRecord::ConnectionAdapters::SchemaStatements | Ruby on Rails API [Official]

How can I rename a database column in a Ruby on Rails migration? – Stack Overflow

カラムのデータ型を変更する

参考:

Rails でカラムのデータ型を変更する場合の手順 | give IT a try

マイグレーションのバージョニング

参考:

Rails 5 から導入された migration versioing について | 日々雑記

rails db:migrate コマンド

参考:

rake db_migrate 時に行われる処理を読む | Code Reading Wiki

rake_tasks – rails/railtie.rb at v5.2.2 · rails/rails – GitHub

db:migrate – rails/databases.rake at v5.2.2 · rails/rails – GitHub

rails/databases.rake at v6.0.0.rc1 · rails/rails – GitHub

rails/migration.rb at v5.2.2 · rails/rails – GitHub

ActiveRecord::Tasks::DatabaseTasks

参考:

ActiveRecord::Tasks::DatabaseTasks | Ruby on Rails API [Official]

rails/database_tasks.rb at v6.0.0.rc1 · rails/rails – GitHub

ActiveRecord::Migration

参考:

ActiveRecord::Migration | Ruby on Rails API [Official]

rails/migration.rb at v5.2.3 · rails/rails – GitHub

プライマリキー

参考:

Rails で id 以外を主キー (primary_key) に設定する | KaQiita

Rails4 db:migrate で id 以外のカラムにプライマリキーの設定を行う | PAYFORWARD

Rails でプライマリーキーを文字列で扱う – Qiita

How to override default primary key id in Rails | Ruby Journal

How to create a model without primary key in rails – Stack Overflow

プライマリキーとして UUID を使う

参考:

Rails の UUIDプライマリキーを試す – Qiita

Rails のモデル ID に UUID を使う 翻訳 | TechRacho

Rails 5.2.3 + MySQL + Ridgepole でテーブルの主キーに UUID を使う – Qiita

Rails で uuid を取り扱う時の Tips – Qiita

Set active_record config for always creating uuids in generators by jmccartie · Pull Request #21762 · rails/rails – GitHub

複合プライマリキー

参考:

Rails で id 以外を主キー (primary_key) に設定する | KaQiita

Rails で複合主キーのテーブルを扱う | RE:ENGINES

Ruby on Rails で複合キーを扱う | Ruby on Rails with OIAX

ActiveRecord で複合プライマリーキーのテーブルを扱う | kakakakakku blog

rails で複数カラムプライマリキーは推奨されない? – スタック・オーバーフロー

create_join_table

参考:

create_join_table – ActiveRecord::ConnectionAdapters::SchemaStatements | Ruby on Rails API [Official]

単独のマイグレーションを作成する | Rails ガイド [公式]

has_and_belongs_to_many 関連付けに対応する結合テーブルを作成する | Rails ガイド [公式]

create_join_table – rails/migration.rb.tt at v5.2.1 · rails/rails – GitHub

HABTM link tables not taking isolate_namespace value in mountable engine – Stack Overflow

ユニーク制約付きのインデックスを作成する

マイグレーションで add_indexunique: true オプションを付ける。

def change
  add_index :users, :mail_address, unique: true
end

複合インデックスにユニーク制約を付ける。

def change
  add_index :daily_reports, [:site_id, :created_at], unique: true
end

カラム数が多い時は name オプションでインデックス名を指定することができる。

def change
  add_index :records, [:key1, :key2, :key2],
    unique: true, name: 'by_key1_and_key2_and_key3'
  end
end

モデルで保存前にユニーク制約のバリデーションを行う。

validates :user_id, uniqueness: true

複合キーについてユニーク制約のバリデーションを行う。

validates(
  :key1,
  uniqueness: {
    scope: [:key2, :key3]
    message: 'Duplicated'
  }
)

参考:

データベースのカラムに index を追加する | fv17 の日記

複数のカラムに一意制約 (ユニーク) を設ける | Yamakichi’s blog

キー・複合キーをきちんと利用する – Qiita

migration で複数カラムの index を生成する時の注意事項 | マオの徒然日記

マイグレーション時に UNIQUE インデックスを設定する方法 単体・複数の場合 | hello-world.jp.net

DB につけた一意制約 (add_index xxxs, :yyy_id unique: true) を削除する – Qiita

add_index – ActiveRecord::ConnectionAdapters::SchemaStatements | Ruby on Rails API [Official]

add_index | Rails ドキュメント (railsdoc.com)

uniqueness | Rails ガイド [公式]

validates – ActiveModel::Validations::ClassMethods | Ruby on Rails API [Official]

Rails で UserID に一意制約を設けたい | teratail

How do I make a column unique and index it in a Ruby on Rails migration? – Stack Overflow

How to Create a New Table With a Unique Index in an Active Record / Rails 4 Migration – Stack Overflow

外部キー制約を付与する

外部キー制約とは、他のテーブルを参照するカラムに参照先に存在するキーしか入らないように制限する制約のこと。

参考:

外部キーと rails の add_foreign_key の意味 – Qiita

Rails で外部キー制約のついたカラムを作る時の migration の書き方 – Qiita

外部キー制約をマイグレーションで表現する方法 | suin.io

マイグレーションの index、foreign_key の設定 – Qiita

Reference と foreign_key の違い | YOSHINO 日記

Rails4 で外部キー制約をつけるときに見直すメモ | nikulog

add_foreign_key – ActiveRecord::ConnectionAdapters::SchemaStatements | Ruby on Rails API [Official]

Ruby on Rails の外部キー制約について | teratail

migration with add_foreign_key: ‘column “user_id” referenced in foreign key constraint does not exist’ – Stack Overflow

マイグレーションの SQL を取り出す

参考:

マイグレーションを実行せずにマイグレーションの SQL を表示する 翻訳 | TechRacho

非同期でマイグレーションを実行する

参考:

Asynchronous Active Record migrations | Kir Shatrov

Managing db schema changes without downtime | Sam Saffron

reset_column_information

マイグレーションでテーブルのカラム構成に変更を加えた場合にモデルのカラム情報をリセットする。

マイグレーション内でレコードを操作するのはあまり良い運用ではないが、レコードの操作が必要な場合にはその直前で操作対象レコードのモデルに対して reset_column_information を呼ぶようにする。

参考:

migration の中で model を触ったら必ず reset_column_information する | onk.ninja

rails で db:migrate した後 rails プロセス再起動が必要な理由 – Qiita

Rails で信頼性の高い Migration を書くには – Qiita

migration 時に reset_column_information を実行すると db:seed したときに NoMethodError が発生する – Qiita

reset_column_information – ActiveRecord::ModelSchema::ClassMethods | Ruby on Rails API [Official]

How to refresh the database connection – Stack Overflow

ActiveRecord::Migration::CheckPending

開発時に保留になっているマイグレーションを検出して例外を発生させるミドルウェア。

参考:

CheckPending – rails/migration.rb at v5.2.3 · rails/rails – GitHub

ActiveRecord::PendingMigrationError

開発時に保留になっているマイグレーションがあることを知らせる例外。

参考:

ActiveRecord::PendingMigrationError はどうやって発生するのか | freedom-man

PendingMigrationError – rails/migration.rb at v5.2.3 · rails/rails – GitHub

active_record.migration_error – rails/railtie.rb at v5.2.3 · rails/rails – GitHub

No connection pool for ActiveRecord::Base エラー

参考:

No connection pool for ActiveRecord::Base – Stack Overflow

Tips

参考:

Rails で信頼性の高い Migration を書くには – Qiita

関連 Gem

Ridgepole

参考:

winebarrel/ridgepole: Ridgepole is a tool to manage DB schema. It defines DB schema using Rails DSL, and updates DB schema according to DSL – GitHub

Strong Migrations

参考:

ankane/strong_migrations: Catch unsafe migrations at dev time – GitHub

zero_downtime_migrations

参考:

LendingHome/zero_downtime_migrations: Zero downtime migrations with ActiveRecord 3+ and PostgreSQL – GitHub

Outrigger

参考:

instructure/outrigger: tag your migrations – GitHub

Handcuffs

参考:

procore/handcuffs: A Ruby gem for running Active Record migrations in phases – GitHub

Composite Primary Keys for ActiveRecords

参考:

composite-primary-keys/composite_primary_keys: Composite Primary Keys support for Active Record – GitHub

Rails で複合主キーのテーブルを扱う | RE:ENGINES

タグ:

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です