基本
・rails g model
やrails 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
既存カラムの内容を変更
既存カラムを変更する場合、up
とdown
を書かないとロールバックできないので注意。
現在の内容は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