Railsガイドを読む #3 ~Active Record マイグレーション~
Railsガイド
上記のサイトはRailsのガイドが書かれているRailsを使う人間ならば必ず目を通すであろうガイド。 プログラミング初心者である自分はその中でRailsのことだけでなくIT用語でわからない用語が複数出てきたので、しっかりと理解して読み進めていきたいと思う。
なのでこの記事では実際にわからない用語や基礎的な内容で知っておきたいことを調べそれについてまとめていきたい。
わからない用語
スキーマとマイグレーションファイル
⋯スキーマは空の状態から始まって、そこにマイグレーションファイルの変更を加えていくことでテーブル、カラムが追加や削除される。なのでマイグレーションファイルでスキーマのバージョンをどんどん更新していく感じ。
マイグレーションファイルでカラムを追加する
⋯Active Recordに用意されているジェネレータを使うことで自動的にタイムスタンプを生成することができる。さらに編集したいカラムやインデックスをコードに付随させることでそれらも自動的に生成 される。
例:part_numberカラムを追加し、インデックスも追加したい場合,rails g migration AddPartNumberToProducts part_number:string:index
とする。
書き方はAdd(削除する場合はRemove) + 追加するカラム名 + To(Removeの場合はFrom) + テーブル名
。ちなみに追加するカラム名の部分はわかる言葉ならなんでもいい。複数のカラムを追加したい場合はDetailsなどにしたり。
class AddPartNumberToProducts < ActiveRecord::Migration[7.0] def change add_column :products, :part_number, :string add_index :products, :part_number end end
テーブルを作成する
⋯基本的にジェネレータを使ってモデルを作成すると自動でテーブルも作成されるためあまりテーブルのみを新規で作成することはないような気がするが、やり方は覚えておく。
rails g migration CreateProducts name:string
とすることでProductsテーブルを作成しそこにnameカラムを追加する。
class CreateProducts < ActiveRecord::Migration[7.0] def change create_table :products do |t| t.string :name t.string :part_number t.timestamps end end end
マイグレーションファイルで使えるメソッド
⋯これまでに説明してきたremove_column
やadd_column
などのメソッドの他にもカラムの情報を変更できるchange_column
メソッドや、not null制約を変更するchange_column_null
メソッド、デフォルト値を指定するchange_column_default
メソッドがある。
change_column :products, :part_number, :text # productsテーブルのpart_numberカラムの型をtextに変更
参照整合性の保証
⋯validates :foreign_key, uniqueness: true
のようなバリデーション機能は、モデルでデータの整合性を強制している。dependentオプションなどだけでは参照整合性を維持できないためデータベースの外部キー契約機能などを用いて参照整合性を高められる。
executeメソッド
⋯Active Recordが提供するヘルパーの機能だけでは不十分な場合、executeメソッドで任意のSQLを実行できる。
changeメソッド
⋯テーブルやカラムに変更を加える場合に使われるメソッド。このメソッドを使うとマイグレーションを逆進させる(取消す)ことができる。
up/downメソッド
⋯changeメソッドの代わりに使え、upメソッドではスキーマに対する変換方法を記述し、downメソッドではupメソッドによって行われた変換をロールバックする方法を記述する。
revertメソッド
⋯revertメソッドを使うとActive Recordマイグレーションのロールバック機能を利用できる。
マイグレーションの実行
⋯rails db:migrate
ではまだ実行されていないchangeまたはupメソッドを実行する。またdb:schema:dump
コマンドも同時に呼び出されるため、スキーマファイル(db/schema.rb)を更新し、スキーマがデータベースの構造に一致するようにする。
マイグレーションファイルの指定をしたい場合はrails db:migrate VERSION=20080906120000
のようにコマンドの後にVERSIONを追記することでそのファイルのみマイグレーションを実行する。
マイグレーションのロールバック
⋯直前のマイグレーションを戻したい場合、rails db:rollback
でロールバックできる。もしもマイグレーションを2つ以上ロールバックしたい場合は、rails db:rollback STEP=3
とすることで最後に実行した3つのマイグレーションがロールバックされる。
(rails db:migrate:redo STEP=3
のようにredoコマンドでルールバックと再マイグレーションを一度に実行できるショトカコマンドもある)
データベースを設定する
⋯rails db:setup
コマンドは、「データベースの作成」「スキーマの読み込み」「seedデータを用いたデータベースの初期化」をまとめて実行する。
データベースをリセットする
⋯rails db:reset```コマンドは、データベースをdropしてsetupを実行する。
環境を指定してマイグレーションを実行する
⋯デフォルトではrails db:migration
はdevelopment環境で実行される。これを他の環境で実行する場合は、コマンドをrails db:migrate RAILS_ENV=test
とするとtest環境でマイグレーションを実行することとなる。
マイグレーション実行結果の出力を変更する
⋯あまり使うイメージができないが、マイグレーション実行時、結果としてデフォルトでは実行内容とそれぞれの所要時間が出力されるが、これをsayメソッドなどを使うと指定したメッセージを出力したり、所要時間を設定したりできる。
マイグレーションの変更
⋯ミスなどでマイグレーションを編集したくなった場合、ロールバックしてマイグレーションを修正すればいいがあまりこのやり方は良くない。開発環境のみでのマイグレーションならいいが、これがproduction環境なら大変だし、開発環境でも共同作業なら他の人の誤解やエラーを招くことになりかねない。そのためマイグレーションファイルを編集する場合、既存のファイルを修正するのではなく、新たに修正用のマイグレーションファイルを用意してマイグレーションを更新する方が良い。