Tatehitoの技術メモ

ソフトウェアエンジニアです。いろいろ書きます。

【Rails】migrationファイルの生成・記述方法のまとめ

Railsにおけるmigrationを使ったテーブル定義の変更方法は、Qiitaを筆頭に、ちょっとググればすぐ出てきます。大変ありがたいのですが、一向にmigrationファイルの書き方を覚えられないし、毎回ググるのも面倒になってきたので、「自分のブログを見れば全部わかる」状態を目指して、まとめることにしました。

まとめといっても、実際に自分が使ったことのあるものだけを記載しています。随時更新していきます。

既存テーブルに対する変更

カラムを追加する

ファイル生成コマンド
rails g migration AddColumnTo[クラス名] [カラム名]:[データ型]
※追加するカラムはスペース区切りで複数指定可

# migrationファイル
def change
  # add_column :対象テーブル名, :対象カラム名, :型
  add_column :users, :age, :integer
end

カラム名を変更する

ファイル生成コマンド
rails g migration Rename[変更前のカラム名]ColumnTo[変更後のカラム名]

# migrationファイル
def change
  # rename_column :[対象テーブル名], :[変更前のカラム名], :[変更後のカラム名]
  rename_column :users, :uid, :user_id
end

カラムのデータ型を変更する

ファイル生成コマンド
rails g migration ChangeDatatype[カラム名]Of[テーブル名]

# migrationファイル
def change
    # change_column :対象テーブル名, :対象カラム名,  :変更後のデータ型
    change_column :users, :name, :string
end

※ただし、PostgreSQLでintegerやboolean型に変更するとPG::DatatypeMismatch: ERRORというエラーが起きる場合があります。change_columnメソッドを以下のようにすると解消します。

change_column :users, :age, 'integer USING CAST(age AS integer)'

カラムにオプションを設定する

デフォルト値

ファイル生成コマンド
rails g migration AddDefalutValue[カラム名]Of[テーブル名]

# migrationファイル
def change
    # change_column :対象テーブル名, :対象カラム名, :型, default: デフォルト値
    change_column :users, :age, :integer, default: 20
end

外部キー制約

ファイル生成コマンド
rails g migration AddForeignKeyTo[テーブル名] [カラム名]:references

# migrationファイル
def change
    # add_reference :対象テーブル名, :対象カラム名, foreign_key: true
    add_reference :users, :club, foreign_key: true
end

NOT NULL制約

ファイル生成コマンド
rails g migration Change[カラム名]Of[テーブル名]

falsetrueとすれば制約を外すことができる。

# migrationファイル
def change
    # change_column_null :対象テーブル名, :対象カラム名, false
    change_column_null ::users, :user_id, false
end