Ruby on Railsでデータベースのテーブルにカラムを追加する方法

よこのじ(@yokonoji_work)です。

Ruby on Railsでデータベースのテーブルにカラムを追加するには、モデル生成時にできるマイグレーションファイルとは別に、カラムを追加するためのマイグレーションファイルを作成する必要があります。

その方法と合わせて、任意の順番にカラムを追加する方法と、1つのマイグレーションファイルのみを適用する方法もご紹介します。

カラムを削除する方法については「Ruby on Railsでデータベースのテーブルのカラムを削除する方法」を参考にしてください。

カラム追加のためのマイグレーションファイルを作成する

/db/schema.rb ファイルを見ると、既にあるテーブルの情報を確認できます。

今回は次のようなテーブルが既にある状態で、addressというstring型のカラムを追加してみます。

create_table "users", force: :cascade do |t|
  t.string "name"
  t.string "email"
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
end

カラムを追加するためのマイグレーションファイルを生成するコマンドは、次のような形となります。

$ rails g migration Addカラム名Toテーブル名 カラム名:データ型

今回の例ではaddressというstring型のカラムをusersテーブルに追加したいため、次のようなコマンドになります。

$ rails g migration AddAddressToUsers address:string

このコマンドを実行すると、/db/migrate/20190814133736_add_address_to_users.rb のようなファイルが生成されます。

class AddAddressToUsers < ActiveRecord::Migration[5.1]
  def change
    add_column :users, :address, :string
  end
end

カラムの追加位置を任意の順番にする

先ほど生成したマイグレーションファイルのままカラムを追加すると、name、email、created_at、updated_atという順番の後ろにaddressカラムが追加されます。これでは、並びが美しくありません。

そのため、「after: :name」という記述を追加してnameの後ろにaddressカラムが追加するようにします。

class AddAddressToUsers < ActiveRecord::Migration[5.1]
  def change
    add_column :users, :address, :string, limit:50, after: :name
  end
end

また、上限を50文字に制限するための「limit:50」も追加してみます。

なお、上記の記述でMySQLではうまくいきますが、PostgreSQLとsqliteではカラムの追加位置を強制することができず、末尾に追加されてしまいます。

カラム追加分のマイグレーションファイルのみを反映させる

カラム追加用のマイグレーションファイルとは別のファイルがある場合、rails db:migrate を実行するとそれらのファイルの内容も反映されます。

よくわからないものは反映させたくない・・・。そんなときは今回作成したカラム追加分の内容のみを反映させることができます。

次のコマンドを実行してみてください。

$ rails db:migrate:status

実行すると、既にマイグレーションされたもの(statusがup)、まだマイグレーションされていないもの(statusがdown)が確認できます。

rails db migrate status

この中から、statusがdownのもののみ反映させれば良いので、そのMigration IDをコピーしておきます。

そして、次のようにVERSION=のあとにIDを記入してください。

$ rails db:migrate:up VERSION=20190814133736

 

以上、Ruby on Railsでデータベースのテーブルにカラムを追加する方法でした。機能追加などでカラムの追加が必要になることはよくあるので、手順を覚えておきたいですね。