プログラミング

【Ruby on Rails】マイグレーションってなんだ?【基本の意味を説明】

この記事のターゲット

  • Ruby on Railsを学んでおり、db migrationの意味が分からない人
  • マイグレーションについて理解したい人
  • 【db migration 意味】で辿り着いた人
  • 例によって、自分自身(勉強中のため)

Railsにおけるマイグレーションとは

まずは語源から調べてみましょう。

マイグレーションとは、システム、または、データ資産の移行作業のことである。

マイグレーションは、基幹システムを新しいプラットフォームへ移行したり、OSやハードウェアなどの環境が異なるシステムへの移行を指す場合が多い。

マイグレーションは、手作業でデータのエクスポートやインポートなどの移行を行う場合もあるが、手作業ではミスが起こる可能性が高い。そのため、専用の移行ツールを用いて自動的に行われる場合もある。この移行ツールも、利用中のシステムや移行先の環境などを考慮して、カスタマイズされた後に使用されることが多い。

移行には、異なる環境・機種間の移行、オープン系システムから別のオープン系システムへの移行、レガシーシステム(メインフレームを使った古いシステムのこと)からオープン系システムへの移行などさまざまな種類があるが、特に、レガシーシステムからオープン系システムへの移行はレガシーマイグレーションと呼ばれる。

IT用語辞典バイナリ様:マイグレーション

マイグレーションを理解するポイント

  • マイグレーションはデータの移行作業の事だよ
  • 手作業のことも指すが、ツールを用いて自動でやることもあるよ
  • 違うシステムへの移行とかのことも指すよ

このあたりですね、つまり自分の環境から別の環境へデータを移行するときに使う一連の作業みたいなものだと理解すれば良さそうです。

マイグレーションのやりかた

マイグレーションは以下の2つのステップで行います。

  1. マイグレーションファイルの作成
  2. マイグレーションファイルの実行

めっちゃシンプルですね、では見ていきます。

マイグレーションファイルを作成

まずはターミナル上で下記コマンドを実行してmigrationファイルを生成します。

# $は打ちません
$rails generate model Name content:text

/*
  generateはgと省略可能
  Nameはマイグレーションファイル名、content:textは[カラム名]:[データ型]を指す
*/

そうすると、db/migrateフォルダ内に.rbファイルが自動生成されます。

class CreateNames < ActiveRecord::Migration[5.0]
  def change
    create_table :posts do |t|
      t.text :content

      t.timestamps
    end
  end
end

 

勝手にNameって打ったのにNamesになってますね、この辺はRailsのルールみたいなので、覚えておこう…。

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

マイグレーションファイルの実行は簡単です。ターミナルに$rails db:migrateと打ち込みます。

$ rails db:migrate
== 20190114075400 CreatePosts: migrating ======================================
-- create_table(:names)
   -> 0.0028s
== 20190114075400 CreatePosts: migrated (0.0029s) =============================

これだけでデータベース上にnamesテーブルが作成されます。こんな感じ

id content created_at updated_at

このとき、id、created_at、updated_atというカラムが作成されていますがこれは仕様です。というか自動で作られるものだと思って良いです。個人的にはなくても絶対欲しいカラムなので、勝手に作られて助かります。

作成されたテーブルの使い方

さて、テーブルが作成されたわけですがこのテーブルの使い方についてもあんまり考える必要がありません。さっき実行した$rails db:migrateのタイミングで一緒にモデルが作られています。

app/modelsの中にname.rbがあります。めっちゃややこしいけど、Rails内では複数形にならないんですね…。

class Name < ApplicationRecord
end

こんな内容です。class Name まではJavaとかと同じだけど、 < ApplicationRecordについてはRubyの記法です。ApplicationRecordを継承していることを表しています。

ブロックに{}を用いないのも特徴ですかね、class から endまでがclassの記述ですが、これはインデントが違っても大丈夫なのかな・・・?今度調べてみよう

コンソールでの動作確認

ここでコンソールを使います。$rails consoleでターミナル上でコンソールを起動します。

# コンソールの起動
$rails console 

# nameインスタンスの生成
name = Name.new(content:"Content")

# インスタンスをデータベースに保存
name.save

 

これでデータベースにレコードが保存されました。

id content created_at updated_at
1 help 2019/01/14 18:46:59 2019/01/14 18:46:59

idはint型で、自動的に数字が連番で振り分けられます。created_atとupdated_atは作成日と更新日の事なので、save実行時の時刻が自動的に書き込まれます。

コントローラーで動かす

ようやく来ました、コンソールで動かしたような事をコントローラーでも動かします。

# nameを全件取得する
name = Name.all

# 先頭だけ取得する
name = Name.first

 

これをページに表示する方法は、疲れたのでまた別記事で…。

力尽きました・・・。