前提
ここではキャメルケースで命名するが、スネークケースでも良い。
blogsテーブルに対して変更を加えると仮定し、まとめて見た。
blogsテーブルを作成
rails g migration CreateBlogs
※通常は、Model生成時、一緒にテーブルを作成することがほとんどだから、よっぽどのことがない限り使わない。
def change
create_table :blogs do |t|
t.string :name
t.string :email
t.timestamps
end
#add_indexすると、user_idに関連付けられたすべてのマイクロポストを作成時刻の逆順で取り出しやすくなる。
add_index :microposts, [:user_id, :created_at]
end
blogsテーブルを削除
rails g migration DropBlogs
def change
drop_table :users
end
##blogテーブルにカラムを追加
rails g migration AddTitleToBlogs
rails g migration AddColumnsToBlogs
def change
add_column :blogs, :image, :text
# カラムを追加する場所を、:afterで指定
add_column :users, :status, :string, :after => :email
end
##blogテーブルからカラムを削除
rails g migration RemoveTitleFromBlogs
rails g migration RemoveColumnsFromBlogs
def change
remove_column :blogs, :image, :text
end
##blogsテーブルのtitleカラムの名前をcontentに変更
rails g migration RenameFromTitleToContentOnBlogs
def change
rename_column :blogs, :title, :content
end
blogsテーブルにカラムのindexを追加・削除
rails g migration AddIndexTitleToBlogs
# 追加
add_index :blogs, :title
# ユニーク追加
add_index :blogs, :title, unique: true
# 削除
remove_index :blogs, :title
# 複合インデックスの場合
add_index :blogs, [:name, :name2]
def change
create_table :users do |t|
t.string :name, null: false
t.string :email, null: false
t.string :password_digest, null: false
t.timestamps
t.index :email, unique: true
##blogsテーブルに外部キー(user_id)を設定
rails g migration AddUserRefToBlog user:references
#user:referencesをつけて、一気にmigarateまで持って行くのもあり。
def change
add_reference :blogs, :user, foreign_key: true
# 外部キーの削除
remove_foreign_key :blogs, column: :user_id
# カラムも一緒に削除
remove_reference :blogs, :user, foreign_key: true
end
##blogsテーブルにNOT NULL制約を設定
# 既存のテーブルの既存のカラムをNOT NULL制約する時。
def change
change_column_null :blogs, :name, false
end
# limit30の制約をつける場合
def change
change_column :tasks, :name, :string, limit: 30
end
# 新しくテーブルを追加する時。(limit制約を含めて)
def change
create_table :blogs do |t|
t.string :name, limit: 50, null: false
end
end
up/downの例
# downの処理(バージョンを下げる)後、upする(バージョンを上げる)
def up
change_column_null :blogs, :name, :string, limit: 30
end
def down
change_column_null :blogs, :name, :string
end
ユニークの付与
def change
create_table :blogs do |t|
t.string :name, limit: 50, unique: true
end
end
##その他
def change
create_table :messages do |t|
t.text :body
t.references :conversation, index: true, foreign_key: true
t.references :user, foreign_key: true, null: false
t.boolean :read, null: false, default: false
t.timestamps null: false
end
end
boolean型は通常「値がないならnil」とする実装は少ないため、、カラムを作成する際はnull: false, default: falseなどのオプションであらかじめ制御をするのが一般的。
※null: falseを追加設定するケースも想定する必要あり。
def change
create_table :conversations do |t|
t.integer :sender_id
t.integer :recipient_id
t.timestamps
end
add_index :conversations, :sender_id
add_index :conversations, :recipient_id
add_index :conversations, [:sender_id, :recipient_id], unique: true
end
[:sender_id, :recipient_id]が同じ組み合わせで保存されないようにする。
NOT NULL制約を追加カラムに付与する場合の例
def change
add_column :tasks, :deadline, :datetime, :null => false, default: -> { 'CURRENT_TIMESTAMP' }
end
既存の他のカラムに対してのエラーを出さないように、defaut値を設定する必要がある。
##adminカラムの追加
class AddAdminToUsers < ActiveRecord::Migration[5.2]
def change
add_column :users, :admin, :boolean, default: false, null: false
end
end
複合indexとunique trueを設定
class CreateAddIndexAndPairUniqueMark < ActiveRecord::Migration[5.2]
def change
add_index :job_roles, [:groupable_id, :groupable_type :employee_id], unique: true, name: "change name"
end
end
ポリモーフィックの場合のindexの貼り方
def change
create_table :pictures do |t|
t.string :name
t.integer :groupable_id
t.string :groupable_type
t.timestamps
end
add_index :pictures, [:groupable_type, :groupable_id]
end
end
not nullを追加で実装する場合
https://ver-1-0.net/2018/03/01/rails-migration-not-null