支援対象地域:札幌、仙台、関東、愛知、関西、広島、福岡


はじめに

本記事では、Ruby on Railsについて扱っていきます。Ruby on Railsで開発を行ったり、有名なRailsチュートリアルを行ったりする場合に何度も何度も打ち込むことになるワードの1つが、”rails db:migrate”です。これはデータベースの設定をした際や、構造を変更する際などに出てくるコマンドです。しかし、データベースの変更を行うというのに、SQL文が出てこなかったり、巻き戻し(Rollback)ができる場合とできない場合とで行わせる処理が異なったりなど、はじめのうちは戸惑うことも多いでしょう。
そもそもデータベースをいじることとmigrateという謎の単語との間にどんな関係性があるのか、正直わからないかと思います。本記事では、"rails db:migrate"と打ち込んだときに行われている"migration"から、しっかりと解説していきます。本記事を読んで、Ruby on Railsのデータベースに対する恐怖心やモヤモヤが、少しでも和らいでいただけたら幸いです。本記事は、以下の構成となっております。

はじめに
1.Active Record
2.マイグレーション
おわりに

1.Active Record

本章では、db:migrateと打ち込んだ際に読み込むマイグレーションについて解説していく前に、Active Recordについて解説していきます。マイグレーションは、Active Recordの機能の一つであるため、ざっとActive Recordがなんなのかを抑えていきたいからです。
Active Recordは、MVCモデル(モデル・ビュー・コントローラー)で言うところのM、モデルに値する部分で、ビジネスデータとビジネスロジックが表されるシステムの階層となっています。Active Recordは、データベースに保存する必要があるような長い期間保持しておくべきデータなどの、作成と利用が円滑に行えるようにしてくれます。Active Recordの名前の由来は、ORM(オブジェクト/リレーショナルマッピング)システムにある「Active Recordパターン」を実装したものであるため、同じ名前がつけられています。Active Recordパターンは、Martin Fowler『Patterns of Enterprise Application Architecture』という書籍で記述されたパターンです。
Active Recordパターンでは、オブジェクトとは永続的なデータであると同時に、そのデータに対する振る舞いでもあります。つまり、Active Recordパターンでは、オブジェクトにアクセスするような気持ちでデータアクセスできるかのようなシンプルな仕組みを提示してくれているのです。

2.マイグレーション

それではマイグレーションの解説を始めます。マイグレーションは、データベーススキーマの継続的な変更を、簡潔かつまとめて行うために大変便利な手法です。マイグレーションは、RubyのDSLを用いているため、データベーススキーマを変更したい場合にも、生のSQLを作る必要がなく、データベースの種類に依存せずにスキーマとスキーマへの変更を行うことができます。
データベースにおけるマイグレーションは、いわゆるバージョンに相当します。スキーマははじめ、空の状態ですが、マイグレーションによる変更の度に、テーブルやカラム・エントリが追加されたり、削除されたりします。Active Recordでは、時系列に沿ってスキーマを更新していった軌跡を保持しているため、どの履歴からでも最新バージョンのスキーマへ更新することができます。Active Recordでは、"db/schema.rb"というファイルを更新し、最新のデータベース構造と一致するようにします。

以下が、マイグレーションの一例です。

class CreateProjects < ActiveRecord::Migration[5.0]
def change
create_table :projects do |t|
t.string :name
t.text :description

t.timestamps
end
end
end

上のマイグレーションを実行すると、"projects"という名前のテーブルが追加されます。この中に、stringカラムであるname、textカラムであるdescriptionが含まれています。主キーとなるのはidという名前で、明示的に記述しなくても、暗黙に追加されます。idは、Active Recordモデルのデフォルトの主キーとなります。timestampsは、created_at、updated_atという2つのカラムを追加します。このような特殊なカラムは、Active Recordによって自動で管理されます。
マイグレーションファイルでは、時間を先に進めるときに行いたいことが記述されていることも重要です。Active Recordはすべての処理を巻き戻す(Rollback)ことができるため、マイグレーションを実行することでテーブルが作られますが、巻き戻すことでテーブルを削除することもできるということになります。

おわりに

本記事では、db:migrateと打った際に読み込むマイグレーションの仕組みについて解説しました。Ruby on Railsにおいて、オブジェクトを扱うようにデータベースを更新できる仕組みとなっているのがマイグレーションのため、その仕組みについて理解することで、SQLの理解が多少大雑把でもデータベースを用いたプログラムを作成することができるようになっています。もちろん、SQL文などの知識があったほうが、より複雑な構造のデータベースが作成できるため、データベースの知識を深めることもまた、重要です。