ハッカーを目指す白Tのブログ

夏は白のTシャツを着ています。ラジオが好きです。(ラジオネーム: 隠れキリジダン)

Railsのmigarationについてまとめてみた

Railsでは、データベースにテーブルを作成したり、インデックスを追加したりするのに Active Record の Migration 機能を使う。今回は、Migrationについて、自分が分かりにくいと思った点を中心に解説していきたい。

1.migrationとは何か

Active Record の migrationは、データベースの状態をRubyDSLを用いて定義し、それらをcvsのようにversion管理するものである。すなわち、データベースへのテーブルやカラムの追加、削除を煩わしいSQL文ではなく、簡単なRubyDSLで定義し、その内容をその経過とともに保存できるようにしたものである。そして、このRubyDSLは、使用しているデータベースがMySQLでもSQLiteでも同じ記法で定義することができるため、データベースへのアプリケーションの依存を減らすことができる。Railsのmigrationでは、ひとつのmigrationファイルが、ひとつのversionに相当し、migrationファイルにデータベースの情報を定義していく。

2.rails migration コマンド

migrationファイルを作成する際には、rails migration コマンドを用いる。

bin/rails generate migration クラス名

コマンドで指定するクラス名には命名規則があり、それに従うとmigrationファイルの中身まで、コマンドで指定することができる。しかし、migration ファイルを生成した後に、そのファイルの中身を変更可能なため、そこまで意識する必要はない。
以下、rails migration コマンドと、それによって生成されるmigrationファイルの例を記述する。

#feedsテーブルを追加したい場合、ここではクラス名はCreateFeeds
bin/rails generate migration CreateFeeds
#生成されるファイル名 => db/migrate/年月日時分秒_create_feeds
#生成されるファイルの中身
     class CreateFeeds < ActiveRecord::Migration
       def change
         create_table :feeds do |t|
     
           t.timestamps
         end
       end
     end

#feedsテーブルにcategory_id カラムを追加したい場合、ここではクラス名はAddCategoryIdToFeeds
bin/rails generate migration AddCategoryIdToFeeds
#生成されるファイル => db/migrate/年月日時分秒_add_category_id_to_feeds
#生成されるファイルの中身
     class AddCategoryIdToFeeds < ActiveRecord::Migration
       def change
       end
     end

3.change とup, downメソッドの使い分け

migrationクラスのオブジェクトには、change, up, downのメソッドがある。
まず、changeメソッドとup,downメソッドの使い分けの例を以下にあげる。


1.create_table をするとき   ->changeメソッド
2.add_columnをするとき    ->changeメソッド
3.remove_columnをするとき  ->up, downメソッド
4.drop_tableをするとき    ->up, downメソッド

create_tableやadd_columnなど、新しいものをデータベースに追加するような動作は、逆の動作として、そのテーブルやカラムを削除すればいいだけであり、それを予測することができる。それに対し、remove_columnやdrop_tableなど、既存のデータベースの項目を削除するような動作は、逆の動作として、データベースに新しいものを追加するときに、以前指定していたカラムのデータ型やオプションなどを特定しなければならなく、逆の動作が予測できない。
ここで、changeメソッドを使うのは逆の動作が予測可能なときであり、up,downメソッドを使うのは逆の動作が予測不可能のときである。
したがって、create_tableやadd_columnのときは、changeメソッド、remove_columnやdrop_tableのときはup, downメソッドを用いる。

4.changeメソッドを使う動作と up, down メソッドを使う動作をひとつのMigrationファイルで行う

3.で、changeメソッドと、up, downメソッドの使い分けについて説明したが、ひとつのmigrationファイルでadd_columnやdrop_tableなど使うべきメソッドの違う複数の動作を行いたい場合は、changeメソッドでreversibleを用いると綺麗に定義できる。

#remove_columnなど、up, downメソッドで定義すべきものを、以下のようにreversible にブロックを渡す。
class ChangeMultipleColumsAndTables < ActiveRecord::Migration
  def change
    create_table :categories do |t|
      t.string :name
    end
 
    reversible do |dir|
      dir.up do
        remove_column :articles, :article_name
      end
      dir.down do
        add_column :articles, :article_name, :string
      end
    end
 
    add_column :users, :adress, :string
    rename_column :users, :email, :email_address
  end
end

5.create_tableする際のcreated_at, updated_at カラムの生成方法

#create_tableに引き渡すブロック内でt.timestampと定義する
class CreateCategories < ActiveRecord::Migration
  def change
    create_table :categories do |t|
      t.string :name
      t.text :description

      t.timestamps
    end
  end
end

参照サイト:Active Record Migrations — Ruby on Rails Guides

以上