railsのカラム追加、削除、データ型変更の方法


##目的
マイグレーションのカラムの追加や削除、データ型変更の方法をまとめてみました。



##バージョン

 Rails 5.1.6
 ruby 2.3.1p112

##カラムを追加したい時

blogsテーブルにuser_idを追加してみる
![unspecified.png](https://qiita-image-store.s3.amazonaws.com/0/244070/7dc34559-32c1-2d9c-6d4f-12dcbedbb2e1.png)

書き方は以下の構文をとります。

```
$ rails g migration Addカラム名Toテーブル名 カラム名:カラムのデータ型
```
早速入れてみます。

```
$ rails g migration AddUserIdToBlogs user_id:integer
Running via Spring preloader in process 1697
      invoke  active_record
      create    db/migrate/20181009062338_add_user_id_to_blogs.rb
```

マイグレーションのファイルは以下の通りになりました。

```ruby:20181009062338_add_user_id_to_blogs.rb
class AddUserIdToBlogs < ActiveRecord::Migration[5.1]
  def change
    add_column :blogs, :user_id, :integer
  end
end
```
migrateも忘れずに行います。

```
$ rails db:migrate
== 20181009062338 AddUserIdToBlogs: migrating =================================
-- add_column(:blogs, :user_id, :integer)
   -> 0.0081s
== 20181009062338 AddUserIdToBlogs: migrated (0.0082s) ========================
```

schema.rbのファイルを確認するとしっかり入っているのが確認できます。

```ruby:schema.rb
  create_table "blogs", force: :cascade do |t|
    t.string "title"
    t.text "content"
    t.integer "user_id"
  end
```


##カラムを削除したい時

blogsテーブルからuser_idを削除してみる

![unspecified-1.png](https://qiita-image-store.s3.amazonaws.com/0/244070/0549b1ad-ad1c-392f-8aca-48c08b7f6a14.png)


書き方は以下の構文をとります。

```
$ rails generate migration removeカラム名toテーブル名 カラム名
```
早速入れてみます。

```
$ rails g migration RemoveUserIdToBlogs user_id
Running via Spring preloader in process 1887
      invoke  active_record
      create    db/migrate/20181009065934_remove_user_id_to_blogs.rb
isaatsu:~/workspace/blogs (master) $ 
```

マイグレーションのファイルは以下の通りになりました。

```ruby:20181009065934_remove_user_id_to_blogs.rb
class RemoveUserIdToBlogs < ActiveRecord::Migration[5.1]
  def change
    remove_column :blogs, :user_id, :string
  end
end
```

こちらもmigrateしましょう。

```
$ rails db:migrate
== 20181009065934 RemoveUserIdToBlogs: migrating ==============================
-- remove_column(:blogs, :user_id, :string)
   -> 0.0121s
== 20181009065934 RemoveUserIdToBlogs: migrated (0.0123s) =====================
```

最後にschema.rbのファイルを確認します。

```ruby:schema.rb
  create_table "blogs", force: :cascade do |t|
    t.string "title"
    t.text "content"
  end
```

##カラムのデータ型を変えたい時

user_idのデータ型をstring（文字列）からinteger（数値）に直したい場合を想定します。
最初のスキーマファイルは以下の通りです。

```ruby:schema.rb
create_table "blogs", force: :cascade do |t|
    t.string "title"
    t.text "content"
    t.string "user_id"　#ここをstring→integerにしたい
  end
```
構文は以下の通りです。

```
$ rails g migration ChangeDatatypeカラム名Ofテーブル名
```
実行してみます。

```
$ rails g migration ChangeDatatypeUseIdOfBlogs
Running via Spring preloader in process 2043
      invoke  active_record
      create    db/migrate/20181009071753_change_datatype_use_id_of_blogs.rb
```
ファイルが作成できました。

```ruby:20181009071753_change_datatype_use_id_of_blogs
class ChangeDatatypeUseIdOfBlogs < ActiveRecord::Migration[5.1]
  def change
  end
end
```

ファイルが作成できたのでその中に追記をします。

```ruby:20181009071753_change_datatype_use_id_of_blogs
class ChangeDatatypeUseIdOfBlogs < ActiveRecord::Migration[5.1]
  def change
    change_column :blogs, :user_id, 'integer USING CAST(user_id AS integer)'
  end
end
```

migrateします。

```
$ rails db:migrate
== 20181009071753 ChangeDatatypeUseIdOfBlogs: migrating =======================
-- change_column(:blogs, :user_id, "integer USING CAST(user_id AS integer)")
   -> 0.0690s
== 20181009071753 ChangeDatatypeUseIdOfBlogs: migrated (0.0691s) ==============
```

schema.rbを確認するとstringのデータ型がintegerに変わっています。

```ruby:schema.rb
  create_table "blogs", force: :cascade do |t|
    t.string "title"
    t.text "content"
    t.integer "user_id" #変更箇所
  end
```