スリ飯屋MaLankaのフリーエンジニアな日々

IT実務未経験から約1年、東京でフリーランスのRuby on Railsエンジニアに転職。約2年半、大阪中崎町でスリランカカレーの間借りしてました。フリーランスエンジニアになるためのノウハウ、スリランカの事を発信していきます。

【Rails5】テーブルを作ったが、後からカラムにデフォルト値を設定したい時の方法

【Rails5】テーブルを作ったが、後からカラムにデフォルト値を設定したい時の方法

後からカラムにデフォルト値を設定したい時の方法をメモ。




手順

1. 修正用のマイグレーションファイルを作る。

$ rails g migration change_カラム名_of_テーブル名(複数形)
例
$ rails g migration change_status_of_projects

2. 1で作成したマイグレーションファイルを以下のように修正。

例として、

projectsテーブルの statusカラム のデフォルト値に、openという値を設定するとします。

up => 修正後
down => 修正前

class ChangeStatusOfProjects < ActiveRecord::Migration[5.2]
  def up
    change_column :projects, :status, :string, default: 'open'
  end
  
  def down
    change_column :projects, :status, :string
  end
end

3. db:migrateする

これでデフォルト値が設定できました。

up,downメソッドではなく、

changeメソッドを使うと、

db:migrate:redoした時にエラーを吐かれました。

This migration uses change_column, which is not automatically reversible.
To make the migration reversible you can either:
1. Define #up and #down methods in place of the #change method.
247/5000

# この移行ではchange_columnを使用しますが、これは自動的に元に戻すことはできません。
# 移行を元に戻すには、次のいずれかを実行します。
# 1. #changeメソッドの代わりに#upおよび#downメソッドを定義します。

【おまけ】後からunique属性を追加する場合

$ rails g migration AddIndexToProjects
class AddIndexToProjects < ActiveRecord::Migration[5.2]
  def change
    add_index :projects, :XXX_id, unique: true
    add_index :projects, :YYY_id, unique: true
  end
end

[参考] (https://qiita.com/dawn_628/items/13fa64dc6d600e921ce3)

[ドキュメント] (http://railsdoc.com/migration)