概要
ユーザーモデルにプロフィールに使う画像ファイル名とコメントの2つの属性を追加する。
そのために、既にデータが登録されているデータベースのテーブルに、カラムを追加する。
マイグレーションによるカラム追加
データベースにデータが登録されている状態で、データを損なわずにテーブルのカラムを追加する。大まかな流れは以下のとおり。
- カラム追加用のマイグレーションファイルを生成する
- 追加用マイグレーションファイルの内容を確認する/記述する
- マイグレーションを実行する
現在のテーブルをマイグレートした際のマイグレーションファイルの内容は以下のとおり。
db/migrate/20210320060906_create_users.rb
1 2 3 4 5 6 7 8 9 10 11 |
class CreateUsers < ActiveRecord::Migration[5.1] def change create_table :users do |t| t.string :name t.string :email t.string :password t.timestamps end end end |
カラム追加用マイグレーションファイルの生成
カラム追加のためのマイグレーションファイルを生成するコマンドは以下のとおり。
rails generate migration AddAnyToTable col:type ...
Any
は一般に追加するカラム名を書くが、任意の文字列でよいTable
はカラムを追加するテーブル名col:type
は追加するカラム名と型で複数指定可- 指定しなければ空のマイグレーションファイルが生成され、後から追加内容を記述
1 2 3 4 |
[vagrant@vagrant ex_bbs]$ rails generate migration AddCoumunsToUsers Running via Spring preloader in process 1177 invoke active_record create db/migrate/20210326083051_add_coumuns_to_users.rb |
マイグレーションファイルの記述
コマンド実行の結果、以下のようなマイグレーションファイルが生成される。
20210326083051_add_coumuns_to_users.rb
1 2 3 4 |
class AddCoumunsToUsers < ActiveRecord::Migration[5.1] def change end end |
このファイルのchange
メソッドにカラム追加の命令を記述。
add_column :table, :col, :type
テーブル名、カラム名、型をシンボルで記述する。
1 2 3 4 5 6 |
class AddCoumunsToUsers < ActiveRecord::Migration[5.1] def change add_column :users, :image_file_name, :string add_column :users, :comment, :text end end |
マイグレーションの実行
マイグレーションを実行。
1 2 3 4 5 6 7 |
[vagrant@vagrant ex_bbs]$ rails db:migrate == 20210326083051 AddCoumunsToUsers: migrating ================================ -- add_column(:users, :image_file_name, :string) -> 0.0235s -- add_column(:users, :comment, :text) -> 0.0079s == 20210326083051 AddCoumunsToUsers: migrated (0.0324s) ======================= |
マイグレーションの結果、新たにカラムが追加されている。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
mysql> DESC users; +-----------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-----------------+--------------+------+-----+---------+----------------+ | id | bigint(20) | NO | PRI | NULL | auto_increment | | name | varchar(255) | YES | | NULL | | | email | varchar(255) | YES | | NULL | | | password | varchar(255) | YES | | NULL | | | image_file_name | varchar(255) | YES | | NULL | | | comment | text | YES | | NULL | | | created_at | datetime | NO | | NULL | | | updated_at | datetime | NO | | NULL | | +-----------------+--------------+------+-----+---------+----------------+ 8 rows in set (0.00 sec) |
データが残っていることを確認。追加されたカラムはupdated_at
よりも後ろにある。
1 2 3 4 5 6 7 8 9 |
mysql> SELECT * FROM users; +----+-----------+-----------------+----------------------------------+---------------------+---------------------+-----------------+---------+ | id | name | email | password | created_at | updated_at | image_file_name | comment | +----+-----------+-----------------+----------------------------------+---------------------+---------------------+-----------------+---------+ | 1 | 悟空 | monkey@west.com | 6a77453834293fcef88f115d4d8fe8ef | 2021-03-26 17:34:29 | 2021-03-26 17:34:29 | NULL | NULL | | 2 | 八戒 | piglet@west.com | 96131de181864ba18294e01a88c39318 | 2021-03-26 17:34:48 | 2021-03-26 17:34:48 | NULL | NULL | | 3 | 沙悟浄 | copper@west.com | fabb6c55e63a5b22b377f4ec1cfee51c | 2021-03-26 17:35:07 | 2021-03-26 17:35:07 | NULL | NULL | +----+-----------+-----------------+----------------------------------+---------------------+---------------------+-----------------+---------+ 3 rows in set (0.00 sec) |