Railsでテーブルにカラムを追加する

FBCのdevise gemを使ったプラクティスを進行中です。 今回作成するRailsアプリではdevise gemを使った認証機能とプロフィールページの作成が終了条件になっています。 このプロフィールページにはdeviseのデフォルトで設定されるメールアドレスに加えて、郵便番号、住所、自己紹介文を表示できることが終了条件になっています。 Usersテーブルに郵便番号、住所、自己紹介文を保存するカラムが必要なのでRailsでテーブルにカラムを追加する方法を調べました。

結論

Railsにテーブルへのカラム追加は次の手順で行う。

  1. rails g migration コマンドでmigrationファイルを作成。
  2. rails db:migrate コマンドでテーブルへのカラム追加を反映する。

追加するカラムについて

Usersテーブルに追加するカラムのカラム名とデータ型は次のように選定しました。

カラム カラム名 データ型
郵便番号 zipcode integer
住所 address string
自己紹介文 profile text

データ型の選定についてはあまり自信がないので深堀りした内容を別の記事にまとめようと思います。

実際にカラムを追加してみる

例としてUsersテーブルに上記カラムを追加してみます。

1. カラム追加前の状態を確認

カラム追加前のUsersテーブルのカラムの状態をcolumn_names メソッドで確認します。

$ rails c
irb(main):002:0> User.column_names
=>
["id",
 "email",
 "encrypted_password",
 "reset_password_token",
 "reset_password_sent_at",
 "remember_created_at",
 "created_at",
 "updated_at"]

Railsとdevise gemが自動生成した計8つのカラムが存在しているのを確認できました。

2. migrationファイルの作成

下記コマンドでmigrationファイルを作成できます。

Active Record マイグレーション - Railsガイド

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

ちなみにですが、rails g コマンドはキャメルケース、スネークケースどちらでも大丈夫みたいです。

rails generateコマンドには、キャメルケースでもスネークケースでもどちらでも良い

Railsにおける命名規則 - Qiita

zipcodeaddressprofile カラムを追加するmigrationファイルを作成します。

$ rails g migration AddColumnsToUsers zipcode:integer address:string profile:text
Running via Spring preloader in process 41547
      invoke  active_record
      create    db/migrate/20220903210311_add_columns_to_users.rb

作成されたマイグレーションファイルを確認します。 ファイル名はYYYYMMDDHHMMSS_add_columns_テーブル名.rb で作成されています。

# db/migrate/YYYYMMDDHHMMSS_add_columns_to_users.rb

class AddColumnsToUsers < ActiveRecord::Migration[6.1]
  def change
    add_column :users, :zipcode, :integer
    add_column :users, :address, :string
    add_column :users, :profile, :text
  end
end

foreign key 等のカラム毎の追加設定が必要な場合はこの時点で追記することで指定できるようです。

rails generate migrationコマンドまとめ - Qiita

3. migrationファイルを反映

rails db:migrate コマンドでmigrationファイルを反映してカラムを追加します。

$ rails db:migrate
Running via Spring preloader in process 42834
== 20220903210311 AddColumnsToUsers: migrating ================================
-- add_column(:users, :zipcode, :integer)
   -> 0.0052s
-- add_column(:users, :address, :string)
   -> 0.0004s
-- add_column(:users, :profile, :text)
   -> 0.0003s
== 20220903210311 AddColumnsToUsers: migrated (0.0061s) =======================

4. カラム追加後の状態を確認

カラムの追加を確認します。

$ rails c
irb(main):001:0> User.column_names
=>
["id",
 "email",
 "encrypted_password",
 "reset_password_token",
 "reset_password_sent_at",
 "remember_created_at",
 "created_at",
 "updated_at",
 "zipcode",
 "address",
 "profile"]

zipcodeaddressprofile カラムが追加され合計11のカラム数になりました。

まとめ

generate 系のコマンドは便利だけどやれる事が多すぎるので1つづつ確認しながら慣れていく必要がありそうです。 たくさん触って覚えていこう。

参照

Active Record マイグレーション - Railsガイド

Railsにおける命名規則 - Qiita

rails generate migrationコマンドまとめ - Qiita