マイグレーション
参考:
Active Record マイグレーション | Rails ガイド [公式]
DBマイグレーション | Rails日本語ドキュメント (Ruby STUDIO)
マイグレーション(migration) | Rails ドキュメント (railsdoc.com)
rake db:migrate | Rails ドキュメント (railsdoc.com)
Rails の migration の基本とレシピ集 | Rails Webook
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)
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
参考:
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
複合プライマリキー
参考:
Rails で id 以外を主キー (primary_key) に設定する | KaQiita
Rails で複合主キーのテーブルを扱う | RE:ENGINES
Ruby on Rails で複合キーを扱う | Ruby on Rails with OIAX
ActiveRecord で複合プライマリーキーのテーブルを扱う | kakakakakku blog
rails で複数カラムプライマリキーは推奨されない? – スタック・オーバーフロー
create_join_table
参考:
単独のマイグレーションを作成する | 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_index
に unique: 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
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)
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
外部キー制約を付与する
外部キー制約とは、他のテーブルを参照するカラムに参照先に存在するキーしか入らないように制限する制約のこと。
参考:
外部キーと 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
マイグレーションの 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
参考:
Strong Migrations
参考:
ankane/strong_migrations: Catch unsafe migrations at dev time – GitHub
zero_downtime_migrations
参考:
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
参考: