0
5

More than 1 year has passed since last update.

【Rails】マイグレーション(migration)まとめ

Last updated at Posted at 2020-01-31

基本

rails g modelrails g migrationでマイグレーションファイルを作って、
・必要に応じて修正して、
rails db:migrateでマイグレーションを実行。

テーブルを作成

$ rails g model User name email level:integer
def change
  create_table :users do |t|
    t.string :name
    t.string :email, unique: true, null: false, limit: 100, index: true
    t.integer :level, default: 1, comment: 'ユーザーのレベル'
    t.references :user_group
    t.timestamps
  end
end

オプションもりもり。検索条件に使いそうなカラムにインデックスを貼ると、検索クエリを高速化できます。

テーブルを削除

$ rails g migration DropUsers
def change
  drop_table :users
end

その後マイグレーション後model/user.rbを手動で削除する。

rails d model userを実行する方法もありますが、rails:migration:resetの時にエラーが発生するし、emailsテーブルが存在したという履歴が残らないので微妙です。

カラムを追加

$ rails g migration AddPhoneToUsers
def change
  add_column :users, :phone, :string, after: :email
end

または以下のように書くこともできる。数が多い時はこちらを利用

def change
  change_table :users, bulk: true do |t|
    t.string :phone
    t.remove :hoge
  end
end

外部キーを追加

tasksテーブルにusersテーブルのidを追加する場合

$ rails g migration AddUserToTasks user:references
def change
  add_reference :tasks, :user, foreign_key: true, after: :id
end

外部キー制約を外したい場合、foreign_key: trueを削除した上でモデルにoptional: trueをつける

class Task < ApplicationRecord
  belongs_to :user, optional: true

外部キーのデータ型を変更

def up
  change_column :tasks, :user_id, type: :string
end
def down
  change_column :tasks, :user_id, type: :bigint
end

[Rails]referencesを使用した外部キー設定で沼った

ユニークキーを追加

def change
  add_index :students, :email, unique: true
  add_index :students, %i[student_id email], unique: true
end

カラムを削除

$ rails g migration RemoveNameFromUsers
def change
  remove_column :users, :name, :string
end

カラム名を変更

$ rails g migration ChangeColumnNameOfUsers
def change
  rename_column :users, :iyem, :item
end

既存カラムの内容を変更

既存カラムを変更する場合、updownを書かないとロールバックできないので注意。
現在の内容はdb/schema.rbを参照すると楽です。

$ rails g migration ChangeLevelOfUser
# 変更内容
def up
  change_column :users, :level, :integer, null: false, default: 10
end
# 変更前の状態
def down
  change_column :users, :level, :integer, null: true, default: 0
end

ロールバック

1つ前まで戻す
$ rails db:rollback
3つ前まで戻す
$ rails db:rollback STEP=3
ロールバック前の状態に戻す
$ rails db:migrate

参考

0
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
5