migrationのときにくせ者じゃ気をつけろ的なやつ2選

マイグレーションのときに個人的にええっ?!てなったやつ2選（少なっ）ご紹介します
3選の予定でしたが眠気の都合上２選になりました

## decimal型はデフォルトでは小数点以下0桁

映画レビューのテーブルとして、ratingには5.00満点として小数点以下が２桁入って欲しいとする

```ruby
# migrationファイル
class CreateFilmsReviews < ActiveRecord::Migration[6.0]
  def change
    create_table :films_reviews do |t|
      t.string :title 
      t.decimal :rating
      t.text :comment
      t.integer :rating_user_id
      t.string :director
      t.integer :released 
      t.timestamps
    end
  end
end
```

mysqlでテーブル構造を確認

```
+----------------+---------------+------+-----+---------+----------------+
| Field          | Type          | Null | Key | Default | Extra          |
+----------------+---------------+------+-----+---------+----------------+
| id             | bigint(20)    | NO   | PRI | NULL    | auto_increment |
| title          | varchar(255)  | YES  |     | NULL    |                |
| rating         | decimal(10,0) | YES  |     | NULL    |                |
| comment        | text          | YES  |     | NULL    |                |
| rating_user_id | int(11)       | YES  |     | NULL    |                |
| director       | varchar(255)  | YES  |     | NULL    |                |
| released       | int(11)       | YES  |     | NULL    |                |
| created_at     | datetime(6)   | NO   |     | NULL    |                |
| updated_at     | datetime(6)   | NO   |     | NULL    |                |
+----------------+---------------+------+-----+---------+----------------+
9 rows in set (0.01 sec)
```

おやおやdecimal君、decimal(10,0)とはいかに
とりあえず適当にデータを入れてみる
土曜日に見たグリーンブック点数つけるとしたら4.05点

```
INSERT INTO films_reviews (
  title,
  rating,
  comment,
  rating_user_id,
  director,
  released,
  created_at,
  updated_at
) VALUES (
  'Green Book',
  4.05,
  'ほっこりする友情と黒人差別がメインテーマのロードムービー、見て良かった',
  1,
  'Peter Farrelly',
  2019,
  CURRENT_TIMESTAMP,
  CURRENT_TIMESTAMP
)
```

どれどれ、、、

```
mysql> SELECT rating FROM films_reviews;
+--------+
| rating |
+--------+
|      4 |
+--------+
1 row in set (0.00 sec)
```

テン05どこいった！
というわけでprecisionとscaleを指定しましょう。

```ruby
class ChangeDataTypeFilmsReviewsOfRating < ActiveRecord::Migration[6.0]
  def up
    # precisionは全体の桁数、scaleは小数点以下の桁数
    change_column :films_reviews, :rating, :decimal, precision:3, scale: 2
  end

  def down
    change_column :films_reviews, :rating, :decimal
  end
end
```

データを入れ直す

```
mysql> SELECT rating FROM films_reviews;
+--------+
| rating |
+--------+
|   4.05 |
+--------+
1 row in set (0.00 sec)
```

小数点以下入りました！めでたし、めでたし

decimal型ではprecision, scaleをちゃんと書きましょう


## 複数インデックスの場合はインデックス名をつけましょう

ちょっと都合上さきほどのテーブルに映画の日本語タイトルを追加しました。

```ruby
class AddColumnFilmsReviewsToJapaneseTitle < ActiveRecord::Migration[6.0]
  def change
    add_column :films_reviews, :japanese_title, :string
  end
end
```

複合インデックスを追加してみる

```ruby
class AddCompositeIndexFilmsReviews < ActiveRecord::Migration[6.0]
  def change
    add_index :films_reviews, [:title, :japanese_title, :rating_user_id], unique: true
  end
end
```

rails db:migrateしてみる

```
rails aborted!
StandardError: An error has occurred, all later migrations canceled:

Index name 'index_films_reviews_on_title_and_japanese_title_and_rating_user_id' on table 'films_reviews' is too long; the limit is 64 characters
```

おおう、エラーが、、、
インデックスの名前は64文字までらしい

↓解決（インデックスの名前を指定）

```ruby
class AddCompositeIndexFilmsReviews < ActiveRecord::Migration[6.0]
  def change
    add_index :films_reviews, [:title, :japanese_title, :rating_user_id], unique: true, name: 'each_title_user_rating_idx'
  end
end
```

複合インデックスは付け足し感が半端ないですが、以上です
グリーンブックはおすすめです。是非映画館で観て、観た後にケンタッキーを食べて、でも骨はちゃんとゴミ箱に捨ててください