Railsのmigarationについてまとめてみた
Railsでは、データベースにテーブルを作成したり、インデックスを追加したりするのに Active Record の Migration 機能を使う。今回は、Migrationについて、自分が分かりにくいと思った点を中心に解説していきたい。
目次
1. migrationとは何か2. rails migrationコマンド
3. change と up, down メソッドの使い分け
4. changeメソッドを使う動作と up, down メソッドを使う動作をひとつのファイルで行う
5. create_tableする際のcreated_at, updated_at カラムの生成方法
1.migrationとは何か
Active Record の migrationは、データベースの状態をRubyのDSLを用いて定義し、それらをcvsのようにversion管理するものである。すなわち、データベースへのテーブルやカラムの追加、削除を煩わしいSQL文ではなく、簡単なRubyのDSLで定義し、その内容をその経過とともに保存できるようにしたものである。そして、このRubyのDSLは、使用しているデータベースが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メソッド
ここで、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
以上