Rails migration


Railsのmigrationを触るのは初めてだったので、勉強備忘録のために簡単に書きとどめてみる。

migrationについて

マイグレーションは、データベーススキーマの継続的な変更 を、統一的かつ簡単に行なうための便利な手法。

migrationファイルを作成する

サンプルとしてCompanyテーブルを準備

カラム名 データ型
id integer
name string
description text
created_at datetime
updated_at datetime
$ rails g migration CrateCompany

Active Recordにはマイグレーションの実行順序をファイル名のタイムスタンプでの表示を自動でやってくれる。
作成されたファイルはdb/migrateディレクトリに保存される。

作成されたファイル

class CrateCompany < ActiveRecord::Migration[5.2]
    def change
    end
 end

ActiveRecord::Migration[]にはバージョンが入る。

chengeの代わりにupとdownを使うことができる。
upメソッドにはmigrationする時の内容、downメソッドにはrollbackする時の内容を書く。


class CrateCompany < ActiveRecord::Migration[5.2]
    def up
    end

    def down
    end
end

変更を加える

マイグレートファイルを作成しrails db:migrateを打てば実行してくる。
また直前の変更を取り消すためにはrails db:rollback

テーブルを作成する

class CrateCompany < ActiveRecord::Migration[5.2]
    def change 
     create_table :companies do |t|
    t.string :name
      t.text :description
      t.timestamps
    end
  end
end

このコマンドを打てば自動で上記のようなもの作成してくれる

$ rails g migration CrateCompany name:string description:text

テーブルを変更する

class ChangeTableCompany < ActiveRecord::Migration[5.2]
    def change 
     change_table :companies do |t|
     t.remove :name
     t.string :root_number
     t.index :root_number
     t.rename :description, :description_note
  end
  end
end

上のマイグレーションではnameカラムが削除され、stringカラムであるroot_numberが作成されてインデックスがそこに追加されます。そして最後にdescriptionカラムをリネームしている。

カラムを変更する

change_column :companies, :root_number, :text

モデル名のroot_numberのカラムをtextに変更。

ここでの注意点だが、change_columnchangeメソッドではロールバックすることができない。
changeメソッドではサポートさていないとのこと。
changeでサポートされているマイグレーション定義は

add_column
add_foreign_key
add_index
add_reference
add_timestamps
change_column_default (:fromと:toの指定は省略できない)
change_column_null
create_join_table
create_table
disable_extension
drop_join_table
drop_table (ブロックを渡さなければならない)
enable_extension
remove_column(型を指定しなければならない)
remove_foreign_key(2番目のテーブルを指定しなければならない)
remove_index
remove_reference
remove_timestamps
rename_column
rename_index
rename_table

もしロールバックする場合はup,downメソッドであればchange_columnを使用可能。


class ChangeColumnCompany < ActiveRecord::Migration[5.2]
    def up
     change_column :companies, :root_number, :text
    end

    def down
     change_column :companies, :root_number, :string
    end
end

まだまだmigrationについては知らないことばかりだが、身につけていきたい。