LoginSignup
9
12

More than 3 years have passed since last update.

[Rails]マイグレーションファイルについて勉強してみた!(テーブルへのカラム追加)

Posted at

はじめに

Railsを操作していると、何となく存在は知っているけど、それがどういう役割を果たしているのかよく分かっていないファイルやコマンドが数多くあることに気づきました。
その中の一つが、マイグレーションファイルです。

モデルを作ると、なぜか知らんがマイグレーションファイルが出来上がっていて、rails db:migrateを打ち込むと、schema.rbにテーブルデータとして反映する...
それぐらいの認識でしたが、そこについて深掘りして解説していきます!

マイグレーションファイルとは

マイグレーションファイルは、データベースを生成する際の設計図になるものです。
また、マイグレーションファイルを実行することで、記述した内容に基づいたデータテーブルが生成されます。

マイグレーションファイルを生成する

ターミナルに、以下のように打ち込み、モデルを作成すると、自動的にマイグレーションファイルも生成されます。

基本構文
rails g model モデル名  #ここでは、モデル名を「book」とします
db/migrate/20201114044025_create_books.rb
class CreateBooks < ActiveRecord::Migration[5.2]
  def change
    create_table :books do |t|
      t.timestamps
    end
  end
end

マイグレーションファイルが出来上がった初期状態では、t.timestampsのみがデフォルトで記載されていることが分かります。
それにより、作成日時を意味するcreated_atと、更新日時を意味するupdated_atがカラムに追加されるのです。

それでは、早速作成したマイグレーションファイルを実行していきましょう!
実際に必要になってくるカラムが色々不足している気もしますが、ここはあえてこのままでいきます!

マイグレーションファイルを実行する

作成したマイグレーションファイルは、ターミナルに下記のコマンドを打ち込むと読み込まれ、データベースに反映されます。

コマンド
rails db:migrate

マイグレーションファイルの状態を確認

今回は作成したマイグレーションファイルが一つだけでした。
中には、同時に何個ものモデルを作成することもあると思います(というか、そっちの方が多い気もします)。
そんな時に、自分が作成したマイグレーションファイルが、どこまで実行されているか確認したいときは、以下のコマンドをターミナルに打ち込みましょう。

コマンド
rails db:migrate:status

そうすると、ターミナルに現在のマイグレーションファイルの状態が出力されます。

ターミナル
Status   Migration ID    Migration Name
--------------------------------------------------
  up     20201114044025   Create books

upになっているマイグレーションファイルはすでに実行済みのファイルなのでrails db:migrateコマンドを入力しても読み込まれることはありません。
なのでもし間違った名前でカラムを作成してしまったときにupになっているマイグレーションファイルを編集しても、読み込まれないので意味がないことになります。

参照:【Rails】マイグレーションファイルを徹底解説!

なるほど、それでは、今作成したばかりのbooksテーブルに、新たにカラムを追加したいときは、どうすればいいのでしょうか?
ひとまず、スキーマファイルを確認しにいきましょう!

スキーマファイルとは

マイグレーションが実行されるとdbフォルダにschema.rbというファイルが作成されます。
早速中身をみましょう。

db/schema.rb
ActiveRecord::Schema.define(version: 2020_11_14_044025) do
  create_table "books", force: :cascade do |t|
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end
end

無事にテーブルが作成されているようです。
force: :cascadeという記述により、外部キーが適切であればスキーマが再読み込みできるようになります。
それでは、ここにtitleというカラムを追加しましょう!

カラムを追加する方法

既存のテーブルに、カラムを追加する方法は2種類あります。

1. 新たにマイグレーションファイルを作成して、カラムを追加する
2. rails db:rollbackでカラムを追加する

①カラムを追加するためのマイグレーションファイルを作成する

この場合は、ターミナルに以下のコマンドを入力します

コマンド
rails g migration Add追加するカラム名To追加するテーブル名 追加するカラム名:

今回の場合だと、以下のようになりますね。

ターミナル
rails g migration AddTitleToBooks title:string

すると、以下のようなマイグレーションファイルが作成されます。

マイグレーションファイル
class AddTitleToBooks < ActiveRecord::Migration[5.2]
  def change
    add_column :books, :title, :string
  end
end

あとは、マイグレーションファイルを実行すれば、titleカラムがテーブルにめでたく追加されます。

コマンド
rails db:migrate

rails db:rollbackでカラムを追加する

コマンド
rails db:migrate:rollback

ターミナルにこのコマンドを入力すると、最新のマイグレーションファイルのバージョンがrails db:migrateする前の状態に戻ります。
今回の場合で言うと、ターミナルの表示が以下のように変化します。

ターミナル
Status   Migration ID    Migration Name
--------------------------------------------------
 down   20201114044025    Create books  #upからdownになっている!!!!

つまり、upからdownになることで、データベースがrails db:migrateされる前の状態に戻ります。
db:migrate前に戻ったので、最初に作成されたマイグレーションファイルに、titleカラムを追記してあげることができます。

db/migrate/20201114044025_create_books.rb
class CreateGenres < ActiveRecord::Migration[5.2]
  def change
    create_table :books do |t|
      t.string :title    #ここにtitleカラムを追加!!!!
      t.timestamps
    end
  end
end

あとは①のパターンと同様に、マイグレーションファイルを実行すれば、titleカラムが追加されます。

コマンド
rails db:migrate
db/schema.rb
ActiveRecord::Schema.define(version: 2020_11_14_044025) do
  create_table "books", force: :cascade do |t|
    t.string "title"  #titleカラムが追加された!!!!
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end
end

おわりに

マイグレーションファイルの修正を行う作業は、思っている以上にセンシティブになることが多いので、タイミングや順序などをしっかりと理解した上で取り組むべきだと再認識できました。
また一つ勉強になりました!!

9
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
12