超初心者がエンジニアになるまでの力戦奮闘の軌跡

プログラミングをメインで学んだことのアウトプットブログ

Railsガイドを読む #3 ~Active Record マイグレーション~

Railsガイド

railsguides.jp

上記のサイトは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_columnadd_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環境なら大変だし、開発環境でも共同作業なら他の人の誤解やエラーを招くことになりかねない。そのためマイグレーションファイルを編集する場合、既存のファイルを修正するのではなく、新たに修正用のマイグレーションファイルを用意してマイグレーションを更新する方が良い。