Railsでマイグレーションファイルを扱う時に忘れがちなコマンドや、書き方について必要最低限な分だけ簡単にまとめてみました。
マイグレーションファイルの生成
マイグレーションファイルを生成するコマンドは2つあります。
1つ目がモデルとマイグレーションファイルを同時に作成するコマンドです。
テーブルを新たに作成する時は、このコマンドを使用してモデルとマイグレーションファイルを同時に作成してしまうことが多いです。
$ rails g model "モデル名"
2つ目はマイグレーションファイルのみを生成する方法です。
こちらは主に、既に存在しているテーブルの情報を変更する時に使用します。
$ rails g migration "クラス名"
マイグレーションファイルの書き方
今回はproducts(商品)テーブルを作成し、テーブルの中に「name(商品名)」「description(商品の説明)」 「price(商品の価格)」の3つのカラムを作ることを想定して解説します。
新たにテーブルを作成する時
まずは新しくテーブルを作成する際の書き方です。
制約の設定を特に行わない場合
新たにテーブルを作成する際、制約の設定を特に行わない場合以下の書き方になります。
class CreateProducts < ActiveRecord::Migration[5.2]
def change
create_table :Products do |t|
#t.型の名前 :カラムの名前
t.string :name
t.text :description
t.integer :price
t.timestamps
end
end
end
制約の設定を行う場合
制約の設定を行う場合(以下はカラムが空で保存されるのを防ぐ設定)は、以下の書き方になります。
class CreateProducts < ActiveRecord::Migration[5.2]
def change
create_table :Products do |t|
#t.型の名前 :カラムの名前, 制約: 許可、非許可
t.string :name, null: false
t.text :description, null: false
t.integer :price, null: false
t.timestamps
end
end
end
外部キー制約をつける場合
productsテーブルの他に、商品の画像を保存する「imagesテーブル」があることを想定して説明します。
外部キー制約をつける場合は、以下の書き方で設定することが可能です。
class CreateProducts < ActiveRecord::Migration[5.2]
def change
create_table :Products do |t|
t.string :name
t.text :description
t.integer :price
#t.reference型 :紐付けたいテーブル名, 外部キー制約の設定
t.references :image, foreign_key: true
t.timestamps
end
end
end
上記のように書くことで、「image_id」カラムが作成されimagesテーブルと紐付けることが可能になります。
ちなみに、reference型を使用しないと「foreign_key: true」を付け足しても外部キー制約にはなりません。
既に存在するテーブルに変更を加える時
次は、既に存在するテーブルにカラムを追加したり、既に存在するカラムを変更する場合の書き方をまとめていきます。
カラムを追加する
まずは既に存在するテーブルに新しいカラムを追加する書き方です。
以下の例は、productsテーブルにsize(商品の大きさ)カラムを追加する書き方です。
class AddColumnProducts < ActiveRecord::Migration[5.2]
def change
#add_column :カラムを追加するテーブル名, :新しく追加するカラム名, :型
add_column :products, :size, :string
end
end
カラムを削除する
カラムを削除する場合は「remove_column」を使います。
class RemoveDescriptionFromProducts < ActiveRecord::Migration[5.2]
def change
#remove_column :テーブル名, :削除するカラム名, :型
remove_column :products, :description, :text
end
end
ここで注意しないといけないのが、カラムを削除する際、型を指定してあげないとロールバック時に「型が無い」というエラーが出てしまいます。
カラム名を変更する
次に、作成済のカラムの名前を変更する書き方です。
以下の例では、間違えて作成した「prise」カラムを「price」に変更しています。
class RenamePriseColumnToProducts < ActiveRecord::Migration[5.2]
def change
#rename_column :テーブル名, :変更前のカラム名, :変更後のカラム名
rename_column :products, :prise, :price
end
end
カラムのデータ型を変更する
カラムのデータ型を変更する場合は、changeメソッドではなく、up/downメソッドを使用します。
以下の例では、priceカラムのデータ型を「string」から「integer」に変更しています。
class ChangeDataPriceToProducts < ActiveRecord::Migration[5.2]
def up
#change_column :テーブル名, :型を変更したいカラム名, :変更後のデータ型
change_column :products, :price, :integer
end
def down
#change_column :テーブル名, :型を戻すカラム名, :変更前のデータ型
change_column :products, :price, :string
end
end
「change_column」を使う時、changeメソッドを使用してもマイグレーション自体はできるのですが、ロールバック時にエラーが出てしまいます。そのためup/downメソッドを使って、バージョンを上げるときの処理とバージョンを下げるときの処理を書いておくことで、エラーを回避することができます。
カラムにNOT NULL制約を設定する
最後に、既に存在しているカラムにNOT NULL制約を設定する方法です。
「change_column_null」を使用します。
class ChangeNameToProducts < ActiveRecord::Migration[5.2]
def change
#change_column_null :テーブル名, :制約を設定するカラム名, :null許可、非許可
change_column_null :posts, :name, false
end
end
最後に
マイグレーションファイルの書き方は、慣れていないと忘れやすいと思います。
頻繁に使用する基本的な部分はなるべく覚えて、検索する手間を省いていけるようにした方がいいですね。