【Rails】カラムのデータ型を変える

環境

OS X Yosemite

Ruby 2.3.1

Rails 5.0.0

SQLite3

動機

何も考えずにテーブルを設計してしまい、カラムのデータ型を変更したい。

やること

Userテーブルのageカラムのデータ型をstringからintegerにしたい。

1 migrationファイルを用意します

rails g migration xxxxxxx <- 適切なクラス名

2 migrationファイルにupメソッドとdownメソッドを定義します

upメソッドに変更後の内容、downメソッドに変更前の内容を書きます。

rails db:migrate

でupメソッドの変更が実行されます。

rails db:rollback

でdownメソッドの変更が実行されます。

class ChangeAgeOnUsers < ActiveRecord::Migration[5.0]
  def up
    change_table :users do |t|
      t.change :age, :integer
    end
  end

  def down
    change_table :users do |t|
      t.change :age, :string
    end
  end
end

3 rails db:migrateを実行する

migrationファイルのupメソッドの内容が反映されているか、確認します。

sqlite> .schema users
CREATE TABLE "users" (
  "id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
  "name" varchar,
  "age" integer,
  "created_at" datetime NOT NULL,
  "updated_at" datetime NOT NULL
);

念のため、rails db:rollbackしてみて、ロールバックが期待通りに動作するか、確認します。

sqlite> .schema users
CREATE TABLE "users" (
  "id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
  "name" varchar,
  "age" varchar,
  "created_at" datetime NOT NULL,
  "updated_at" datetime NOT NULL
);

いい感じですね。