更新情報

こんにちは。タイムシフトの野呂です。

私は、34歳で約2ヶ月間集中して自習してWebアプリケーションの開発を行い、Rails3技術者認定ブロンズを一発合格した経験があります。本業では、初心者向けのプログラミング・スクール「Dive into Code」の講師を務めています。

前回のコラムでは、初心者が最初につまずくポイントの「Ruby on Railsの電気信号の流れ」について解説しました。

今回は、次につまずきやすいポイント「マイグレーション」について解説をします。効果的に学習を進めるためのお役に立つことができましたら、幸いです。

マイグレーション

Ruby on Rails は、開発効率を上げるために2つのコンセプトを掲げています。

一つ目は、「Don’t repeat yourself ”同じことを繰り返さない”」。二つ目は、「Convention Over Configuration “設定よりも規約”」です。

これらのコンセプトを遵守するために、様々な機能があります。そのうちの一つが、マイグレーション機能です。

マイグレーションとは、「移動」「移入」「移住」といった意味をもつ言葉です。Ruby on Railsからデータベース内にテーブルの元を移入するためのもの、といった意味合いです。

この機能の存在意義を理解するためには、マイグレーション機能の役割SQLでテーブルを作成する手間について理解する必要があります。

マイグレーション機能の役割

マイグレーション機能をひと言で説明すると、「SQLを書くことなくRubyでデータベース内にテーブルを作成することができる機能」です。

SQLを書く必要がない理由は、Ruby on Rails内のActiveRecordという機能がRubyをSQLに自動翻訳することができるためです。その仕組みを利用すれば、Rubyが記載された所定のファイルを使い翻訳処理を経由してSQLでデータベース操作ができます。

SQLに翻訳される元となるRubyで記載された命令文を、マイグレーションファイルというものに記載します。

例えば、

・ファイル名

20151213130638_create_blogs.rb

 

・ファイル内容

class CreateBlogs < ActiveRecord::Migration

def change

create_table :blogs do |t|

t.string :title

t.text :content

 

t.timestamps null: false

end

end

end

というファイルを作成します。このファイルは、Ruby on Railsのジェネレータというファイル生成機能を使えば、たった一つのコマンドで作成することができます。

具体的には、モデルと一緒にマイグレーションファイルを作成するコマンドや、マイグレーションファイルを単体で作成するコマンドです。

・モデルと一緒に生成するコマンド

$ bin/rails g model Blog

・マイグレーションファイルを単体で生成するコマンド

$ bin/rails g migration CreateBlogs

これらのコマンドを実行すると

・ファイル名

20151213130638_create_blogs.rb

のように、「年月日時間分秒」の数字が割り振られたファイル名で自動生成します。そのため、複数のマイグレーションファイルを生成すると時系列に並べて管理することができるようになります。

そして、マイグレーションファイルを所定のディレクトリ内に配置します。

所定のディレクトリは、Ruby on Railsでは既定のものになっています。

db/migrate

です。

その状態で指定のコマンドを実行すると、db/migrateディレクトリ内のファイルを使い、時系列順にActiveRecordが翻訳して、データベースに対してSQLを実行することができます。

具体的には、rakeコマンドの一種を使います。

$ bin/rake db:migrate

このコマンドを実行すると、前述のRubyがSQLに翻訳されて、データベースに自動接続します。そして、テーブル作成のSQLを自動実行し、正常に作成されたか否かの結果を表示します。なお、一度実行対象になって正常に実行されたマイグレーションファイルは、実行対象から除外されます。まだ実行されていないファイルのみが対象になります。

これらの流れを図解すると以下のようになります。

例:Webアプリケーション名が「achieve」、開発環境(development)の場合

noro2-3-1

マイグレーション機能を使うことで、SQLを書くことなくRubyでデータベース内にテーブルを作成することができます。

SQLでテーブルを作成する手間

一般的にテーブルをSQLで作成する手順は、5つです。

 

1.テーブルを作成するSQLを作成する

2.コンソール上でデータベースに接続する

3.作成したSQLを実行する

4.実行した結果を確認する

5.実行したSQLを時系列に控えておく

 

1.テーブルを作成するSQLを作成する

使用しているデータベース管理システムによって書き方が微妙に異なることがあります。そのため、データベース管理システムの仕様に依存した書き方を覚えなければなりません。

 

2.コンソール上でデータベースに接続する

どのようなデータベース管理システムであっても行う必要があります。

 

3.作成したSQLを実行する

手作業で一つずつ実行したり、まとめて複数のSQLをファイルに記述して一気に実行させたりします。

 

4.実行した結果を確認する

確認するためのSQLを作成して実行します。

 

5.実行したSQLを時系列に控えておく

SQLは実行順序が異なると、異なるものができてしまうため注意が必要です。例えば、テーブル内に新しい列を追加する場合、通常は最後尾の列として追加されます。

 

一方で、テーブルにレコードを追加する際、その「列の順番」を意識してレコード追加のSQLを実行する必要があります。列の順番が異なると意図しない操作をしてしまうことになります。そのため、時系列に何のコマンドを実行したかを覚えておく必要があります

以上の手順でSQLを作成して実行する必要があります。

そのため、各手順でSQLの学習コストや実行順序を覚えておくコストが発生します。学習してSQLを暗記していたとしても、実行順序を覚えておくことは避けて通れません。

これらの手間を解消することができるのが、マイグレーション機能です。

つまずきやすいポイント

初心者がマイグレーション機能でもっともつまずきやすいのは、マイグレーションの実行を忘れてしまうこと、です。

マイグレーションの実行を忘れてしまうよくある原因は、

・Ruby on Rails の MVC 構造に気を取られてデータベースとテーブルの役割をすっかり忘れている

・開発環境での実行は忘れないものの、本番環境での実行を忘れてしまう

というものです。

原因への対策は、前者は、「データを保存しておく箱」がないとWebアプリケーションは動作しない、ということを理解しておきましょう。後者は、開発環境で実行した結果が本番環境に同期されるわけではないことを理解しておきましょう。

特に、rakeコマンドでは、「環境を指定して」コマンドを実行する必要があります。明示せずに実行すると開発環境のみに対してマイグレーションが行われます。

$ bin/rake db:migrate

これは、

$ bin/rake db:migrate RAILS_ENV=develop

と同じ意味のコマンドです。

本番環境に対して実行する際には、

$ bin/rake db:migrate RAILS_ENV=production

と環境を明示する必要があります。

また、本番環境としてHerokuを利用している場合は、

$ heroku run bin/rake db:migrate RAILS_ENV=production

とheroku runを指定して実行しないとHerokuに対して命令を実行することはできません。

初心者がRuby on Railsのマイグレーション機能を使う場合は、マイグレーション機能の役割とSQLでテーブルを作成する手順の背景をしっかり理解しましょう。

私のコラムでは、Ruby on Railsの初心者がつまずきやすいポイントを補う内容をお伝えしていきます。お読みくださり、ありがとうございます。

それでは、また!