マイグレーションファイルの命名について

# 前提
ここではキャメルケースで命名するが、スネークケースでも良い。
blogsテーブルに対して変更を加えると仮定し、まとめて見た。

## blogsテーブルを作成

```ruby
rails g migration CreateBlogs
```
※通常は、Model生成時、一緒にテーブルを作成することがほとんどだから、よっぽどのことがない限り使わない。

```ruby:マイグレーションファイルの例
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テーブルを削除
```ruby
rails g migration DropBlogs
```
```ruby
def change
  drop_table :users
end
```
##blogテーブルにカラムを追加
```ruby
rails g migration AddTitleToBlogs
```
```ruby:複数のカラムを追加する場合
rails g migration AddColumnsToBlogs
```
```ruby
def change
  add_column :blogs, :image, :text
  
  #　カラムを追加する場所を、:afterで指定
  add_column :users, :status, :string, :after => :email
end
```
##blogテーブルからカラムを削除
```ruby
rails g migration RemoveTitleFromBlogs
```
```ruby:複数のカラムを削除する場合
rails g migration RemoveColumnsFromBlogs
```
```ruby
def change
  remove_column :blogs, :image, :text
end
```
##blogsテーブルのtitleカラムの名前をcontentに変更
```ruby
rails g migration RenameFromTitleToContentOnBlogs
```
```ruby
def change
  rename_column :blogs, :title, :content
end
```
## blogsテーブルにカラムのindexを追加・削除
```ruby
rails g migration AddIndexTitleToBlogs
```
```ruby
    # 追加
    add_index :blogs, :title

    # ユニーク追加
    add_index :blogs, :title, unique: true

    # 削除
    remove_index :blogs, :title

    # 複合インデックスの場合
    add_index :blogs, [:name, :name2]
```

```ruby:他のユニーク制約の付与の仕方
 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)を設定
```ruby
rails g migration AddUserRefToBlog user:references
#user:referencesをつけて、一気にmigarateまで持って行くのもあり。
```
```ruby
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制約を設定

```ruby
# 既存のテーブルの既存のカラムを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の例

```ruby

# downの処理（バージョンを下げる）後、upする(バージョンを上げる)
def up
  change_column_null :blogs, :name, :string, limit: 30
end

def down
  change_column_null :blogs, :name, :string
end
```

## ユニークの付与

```ruby
def change
  create_table :blogs do |t|
   t.string :name, limit: 50, unique: true
  end
end
```

##その他
```ruby

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を追加設定するケースも想定する必要あり。

***


```ruby
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制約を追加カラムに付与する場合の例

```ruby
def change
    add_column :tasks, :deadline, :datetime, :null => false, default: -> { 'CURRENT_TIMESTAMP' }
end
```
既存の他のカラムに対してのエラーを出さないように、defaut値を設定する必要がある。

##adminカラムの追加

```ruby
class AddAdminToUsers < ActiveRecord::Migration[5.2]
  def change
  	add_column :users, :admin, :boolean, default: false, null: false
  end
end
```

## 複合indexとunique trueを設定

```ruby
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の貼り方

```ruby
  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