rails migrationやりたい

今回はこのversionでやります

```ruby:
rails: 5.2.3
ruby: 2.6.1
```

## migrationとは
>Active Recordの機能の1つであり、データベーススキーマを長期にわたって安定して発展・増築し続けることができるようにするための仕組み

ruby on rails使っててデータベースを変更するときに楽なやつ

## メリット
SQL書かずにデータベース作れるしコマンドや書き方もわかりやすいから簡単

## デメリット
SQL書かずにデータベース作るから「あれほんまにこれでええんやっけ」とか設計書見て脳死で作ってしまう恐れあるからきをつけようね(3敗)

#migrationの大まかな流れ
####1.モデル作成します

```ruby:
$ bundle exec rails g model モデル名
```

**(migrationファイルとmodelファイル同時に作ってくれる)**

たまーにミスりますが、railsのmodelファイルは複数じゃなくて単数系でお願いします
migrationファイルはテーブル名と一緒になるんで、上のコマンド打てば勝手に複数系で作ってくれるよ

マイグレーションファイルだけ作成できるコマンドもあるよ

```ruby:
$ bundle exec rails g migration クラス名
```

####2.migrationファイルを書いていく

```ruby:
$ bundle exec rails g modelUser
```

とかでてきとうにつくったら下記みたいなmigrationファイル作られるよ
**20190XXXXXXXXXX_create_users.rb**
↑作った日付

作られる場所は


**db/migrate/XXXXXX ←ここ**


```ruby:
class CreateUsers < ActiveRecord::Migration[5.2]
  def change

      t.timestamps
    end
  end
end
```
んでこんな感じのファイルできたらどんどん書いてくよ

```ruby:
class CreateUsers < ActiveRecord::Migration[5.2]
  def change
    create_table :users, id: :integer, limit: 4, comment: 'ユーザーテーブル' do |t|
      t.string :user_key, null: false, comment: 'ユーザユニークキー'

      t.timestamps
    end
  end
end
```
上記ではusersというテーブルを作成してプライマリーキーを設定して
user_keyというカラムを作成してます

####3.インデックスキーの作成

```ruby:
class CreateUsers < ActiveRecord::Migration[5.2]
  def change
    create_table :users, id: :integer, limit: 4, comment: 'ユーザーテーブル' do |t|
      t.string :user_key, null: false, comment: 'ユーザユニークキー'

      t.timestamps
    end
  # 一つのカラムにユニーク制約をかけたい場合
  add_index :users, :key, :unique => true

  # 複数カラムでユニーク制約をかけたい場合
  add_index :users, [:key1, :key2, :key3], :unique => true, :name => 'hoge_uniq_index'
  end
end
```
create_table外ににadd_index:[テーブル名]:[カラム名]:unique => trueで制約かけれる


####4.カラム削除

削除したいカラムがあるテーブルとかでマイグレーションファイルを作成

```ruby:
$ bundle rails g migration RemoveUserKeyFromUsers user_key, :string
```

**カラムを削除したいとき**

```ruby:
  def up
    remove_column :users, user_key
      end

  def down
    add_column :users :user_key, :string
  end
```

**そしてmigrate実行**

```ruby:
$ bundle exec rails db:migrate
```

こんな感じでクラス名で指定したテーブルに対してカラムを削除するための文が記述されています。(この場合はchangeメソッドではなくupメソッドとdownメソッドを分けて記述する必要があります)。

このように比較的使われるとカラムの追加と削除についてはここでご紹介した方法を使うと少し簡単にマイグレーションスクリプトを作成できます。

ただ正直resetコマンド(後で紹介する)使ったほうが楽だよね
でもテーブルの中身消しちゃいけない感じなら上記の方法でやる必要がありますね

####5.中間テーブル作成

referenceというパラメータを使う
reference（参照）はテーブル同士の関係性を示します。

```ruby:
class CreateUsers < ActiveRecord::Migration[5.2]
  def change
    create_table :users, id: :integer, limit: 4, comment: 'ユーザーテーブル' do |t|
      t.string :user_key, null: false, comment: 'ユーザユニークキー'
      t.references  :users,  index: true, foreign_key: true

      t.timestamps
    end
  end
end

```
その後、migrateします。

```ruby:
$ bundle exec rails db:migrate
```

##マイグレーションコマンド一覧
```ruby:
# マイグレート実行
$ bundle exec rails db:migrate
# ロールバック
$ bundle exec rails db:rollback
# 確認
$ bundle exec rails db:migrate:status
# リセット
$ bundle exec rails db:migrate:reset
# カラムのデータ型を変えたい時
$ bundle exec rails g migration ChangeDatatypeカラム名Ofテーブル名
# カラムの名前を変えたい時
$ bundle exec rails g migration rename_[変更前のカラム名]_column_to_[モデル名(複数形)]
# インデックスを削除する
$ bundle exec rails g migration　Delete[削除したいユニークキー名]UniqIndexFrom[テーブル名]
remove_index →　index削除
:, :yyy_id
```
リセットと確認がよく使うかなぁ

##型の対応表
```ruby:
MySQL              Rails
varchar(255)      string
varchar(文字数)     string #limitで文字数を指定
tinytext          text #limitの範囲が1~255
text              text
midiumtext        text #limitの範囲が65536~16777215
longtext          text #limitの範囲が16777216 ~ 4294967285
float              float
double            float #limitの範囲が24~53
tinyint            integer #limitが1
smallint          integer #limitが2
int                integer #limitが4
bigint            integer #limitが8
decimal            decimal
decimal(M,D)      decimal #precision: M, scale: D
datetime          datetime
time              time
date              date
blob              binary
mediumblob        binary #limitが16MB以下
longblob          binary #limitが4GB以下
tinyint(1)        boolean
```

***まとめ***
どんどんまだまだどしどしマイグレーションについて書かないといけないけどメモ的な感じだから追記、追記していきます
間違ってたらオシエテクダサイ