Rails Migration(マイグレーション)入門。カラム追加・削除・変更。
テーブル変更の履歴をソースで管理できて、スキーマ作成を自動化できる便利なマイグレーションですが、実際に使うにはカラム追加・削除・変更それぞれの場合の使い方を覚えておく必要があります。
今回は、それぞれのケースでのマイグレーションの宣言方法を見ていきます。
カラム追加・削除・変更
カラム追加
カラム追加の際に使用するメソッドはadd_columnメソッドです。カラムを追加する場合は下記の様に
add_column :blogs, :category_id, :integer
として
add_column [テーブル名], [カラム名], [型], [オプション]
という形で書きます。
class AddCategoryIdToBlogs < ActiveRecord::Migration[5.1]
def change
add_column :blogs, :category_id, :integer
end
end
さらには、マイグレーション生成時にAddXXXToYYYという形でマイグレーション名を定義してあげると自動で指定したカラムを追加するマイグレーションファイルを生成してくれます。
rails g migration AddCategoryIdToProducts category_id:integer
カラム削除
カラム削除の場合に使用するメソッドはremove_columnメソッドです。
remove_column :blogs, :category_id, :integer
呼び出すメソッドを変更したくらいで渡す引数などはadd_columnと同様です。
remove_column [テーブル名], [カラム名], [型]
さらにremove_columnもマイグレーションで自動生成できます。自動生成する場合のファイル名はRemoveXXXXFromYYYという形にします。
rails g migration RemoveCategoryIdFromBlogs
カラム変更
カラムを変更する場合はchange_columnを使用します。
change_column :blogs, :category_id, :integer
remove_column [テーブル名], [カラム名], [型]
changecolumnは型の変更や桁数などを変更しますが、columnをリネームしたい場合はrenamecolumnを使用します。
rename_column :blogs, :tile, :title
テーブルを変更する
複数のカラムを変更したい場合に上で紹介したないようでひとつずつ書いていってもよいのですが、よりスマートな方法としてchangetableを使う方法があります。changetableを利用するとテーブルの変更が一つのファイルにまとまるので変更をスッキリとまとめることができます。
class ChangeBlogs < ActiveRecord::Migration[5.1]
def change
change_table :products do |t|
t.remove :tag, :category
t.string :comment
t.integer :tag_id
t.integer :category_id
t.index :tag_id
t.index :category_id
t.rename :tile, :title
end
end
end
書きっぷりはcreatetableと似た様な形になります。ここでは、tag,categoryというカラムを削除して comment, tagid, category_idというカラムを追加。 追加したカラムにインデックス付与、tileカラムをtitle(タイプミス修正)をリネームしています。
この変更は先に紹介したものでは代替可能ですが、こちらで書いた方がいちいちテーブル名を書く必要がなくコードを読んだ場合に一つのテーブルに関する変更だなというのがわかりやすいです。何個以上変更が加わったらchangetableにすべきというものはないですが、3箇所程度の変更からchangetableを検討し始めるくらいかなと思います。
まとめ
今回はマイグレーションにおけるカラムの追加・変更・削除について詳しくまとめました。マイグレーションにはこの他にもそれぞれのマイグレーションコマンドの使い方やオプションの使い方などがあるので適宜時間があるときにまとめていきます。