概要
Railsでは、データベースのテーブルをモデルを通して扱う。そのための開発時点での操作は以下のとおり。
- モデルの生成・操作
 - マイグレーションによるテーブルの生成・操作
 
モデルの生成・削除
モデルの生成
テーブルに対して1つのモデルを生成する。
基本形は以下のコマンド。
rails generate model model_name
生成時にテーブルのフィールド名とフィールドの型を指定する場合(フィールド指定の間はスペース)。
rails generate model model_name col1:type col2:type ... 
フィールドの型
primary_keybinary, booleandate, datetime, time, timestampdecimal, float, integerstring, text
生成されるファイル
実行後、モデルクラスとマイグレーションの2つのクラスファイルが生成される。
モデルクラスファイル
app_name/app/models/model_name
- ファイルの内容はクラス定義
 - クラス名はモデル名のパスカルケース(
ModelName) ApplicationRecordを継承
| 
					 1 2  | 
						class ModelName < ApplicationRecord end  | 
					
マイグレーションファイル
app_name/db/migrate/yyyymmddhhmmss_create_model_name.rb
- テーブルを扱うマイグレーションクラスが定義される
 - マイグレーションクラスは
ActiveRecordモジュールのMigrationクラスを継承している - マイグレーションクラスのクラス 名は
CreateModelNames- パスカルケース
 - 最後にsがついた複数形
 
 - マイグレーションクラスの
create_tableはDSL(ドメイン固有言語、Railsdoc)- テーブル名はスネークケースでモデル名の複数形
 - 生成時にフィールド名と型を指定した場合、
create_tableブロック内でフィールドが定義される 
 
| 
					 1 2 3 4 5 6 7 8 9 10 11  | 
						class CreateModelNames < ActiveRecord::Migration[5.1]   def change     create_table :model_names do |t|       t.string :col1       t.string :col2       .....       t.timestamps     end   end end  | 
					
モデルの削除
モデルの削除は以下のコマンドで、モデルクラスファイルとマイグレーションファイルが削除される。
rails destroy model model_name
ただしデータベース上のテーブルは削除されない。
テーブルの生成・削除
テーブルの生成
以下のコマンドで、マイグレーションファイルの設定に従ってデータベースにテーブルが生成される。
rails db:migrate
モデル生成時にフィールドを指定しなかった場合やモデル生成後にフィールドを追加する場合は、マイグレーションファイルにフィールドを追加する。
| 
					 1 2 3 4 5 6 7 8 9  | 
						class CreateDemoRecords < ActiveRecord::Migration[6.1]   def change     create_table :demo_records do |t|       t.型 :フィールド名       t.timestamps     end   end end  | 
					
一度migrateした後にマイグレーションファイルを修正して再度migrateしても反映されない。一旦rails db:rollbackでテーブル生成前の状態に戻してからマイグレーションファイルを修正して再度実行。
テーブルの削除
ロールバック
rails db:rollbackで直前に生成したテーブルを削除
MySQLでの削除
- MySQLのコンソールで
DROP TABLEを実行 
マイグレーション
model_nameモデルのmodel_namesテーブルを例にとる。
model_nameモデルを削除rails destroy model model_name
- 以下のコマンドでダミーのマイグレーションファイルを生成
rails generate migration 任意の名前
 - マイグレーションファイルの
def changeブロックに以下を追加drop_table: model_names
 rails db:migrationを実行db/migrate/マイグレーションファイルを削除
実行例
モデルの生成
demo_recordという名前でモデルを生成する。このモデルはname:stringとage:integerの2つのフィールドを持つモデルを生成する。
| 
					 1 2 3 4 5 6 7 8  | 
						[vagrant@localhost demo_app]$ rails g model demo_record name:string Running via Spring preloader in process 24003       invoke  active_record       create    db/migrate/20210303061311_create_demo_records.rb       create    app/models/demo_record.rb       invoke    test_unit       create      test/models/demo_record_test.rb       create      test/fixtures/demo_records.yml  | 
					
モデルファイル
モデルファイルがapp/modelsの下に作成される。モデルファイル名はモデル生成時のモデル名のスネークケースになっている。
| 
					 1 2  | 
						[vagrant@localhost demo_app]$ ls app/models/ application_record.rb  concerns  demo_record.rb  | 
					
モデルファイルの内容はモデルクラスの定義で、生成当初は空の定義。モデルクラス名がモデル名のパスカルケースになっている。
| 
					 1 2  | 
						class DemoRecord < ApplicationRecord end  | 
					
マイグレーションファイル
マイグレーションファイルがdb/migrateの下に作成される。
| 
					 1 2  | 
						[vagrant@localhost demo_app]$ ls db/migrate/ 20210303071205_create_demo_records.rb  | 
					
マイグレーションファイルの内容はテーブル生成クラスの定義で、create_tableブロックの中でフィールドの名前と型を指定している。
- モデル名
demo_recordに対して生成されるテーブルクラス名はCreateDemoRecordsで、接頭辞Createにモデル名に複数形のsがついたパスカルケース create_tableブロックでフィールドの型とフィールド名を定義
| 
					 1 2 3 4 5 6 7 8 9  | 
						class CreateDemoRecords < ActiveRecord::Migration[6.1]   def change     create_table :demo_records do |t|       t.string :name       t.timestamps     end   end end  | 
					
テーブルの生成~マイグレーション
rails db:migrateコマンドにより、マイグレーションファイルの設定に基づいてテーブルを生成する。
| 
					 1 2 3 4 5  | 
						[vagrant@localhost demo_app]$ rails db:migrate == 20210303063040 CreateDemoRecords: migrating ================================ -- create_table(:demo_records)    -> 0.0329s == 20210303063040 CreateDemoRecords: migrated (0.0331s) =======================  | 
					
rails dbconsoleでテーブルが生成されていることを確認する。
| 
					 1 2 3 4 5 6 7 8 9  | 
						mysql> show tables; +-----------------------+ | Tables_in_demo_app_db | +-----------------------+ | ar_internal_metadata  | | demo_records          | | schema_migrations     | +-----------------------+ 3 rows in set (0.00 sec)  | 
					
生成されたテーブルの構成を確認。
| 
					 1 2 3 4 5 6 7 8 9 10  | 
						mysql> desc demo_records; +------------+--------------+------+-----+---------+----------------+ | Field      | Type         | Null | Key | Default | Extra          | +------------+--------------+------+-----+---------+----------------+ | id         | bigint       | NO   | PRI | NULL    | auto_increment | | name       | varchar(255) | YES  |     | NULL    |                | | created_at | datetime(6)  | NO   |     | NULL    |                | | updated_at | datetime(6)  | NO   |     | NULL    |                | +------------+--------------+------+-----+---------+----------------+ 4 rows in set (0.01 sec)  | 
					
マイグレーションの状態確認
db:migration:statusでマイグレーションの状況を確認できる。部分的にロールバックした時などの確認に便利。
| 
					 1 2 3 4 5 6 7 8 9 10  | 
						[vagrant@vagrant ex_bbs]$ rails db:migrate:status database: ex_bbs_development  Status   Migration ID    Migration Name --------------------------------------------------    up     20210320060906  Create users    up     20210326083051  Add columuns to users   down    20210331121751  Create posts   down    20210331122545  Create post images  | 
					
ロールバック
すべてロールバック
rails db:rollbackにより、いったんテーブル作成前の状態に戻す。
| 
					 1 2 3 4 5  | 
						[vagrant@localhost demo_app]$ rails db:rollback == 20210303071205 CreateDemoRecords: reverting ================================ -- drop_table(:demo_records)    -> 0.0209s == 20210303071205 CreateDemoRecords: reverted (0.0270s) =======================  | 
					
MySQLで確認すると、テーブルはなくなっている。
| 
					 1 2 3 4 5 6 7 8  | 
						mysql> show tables; +-----------------------+ | Tables_in_demo_app_db | +-----------------------+ | ar_internal_metadata  | | schema_migrations     | +-----------------------+ 2 rows in set (0.00 sec)  | 
					
ロールバックステップ指定
rails db:migrate STEP=nでロールバックするステップ数を指定可能。STEPは大文字でないと機能しない。
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32  | 
						[vagrant@vagrant ex_bbs]$ rails db:migrate:status database: ex_bbs_development  Status   Migration ID    Migration Name --------------------------------------------------    up     20210320060906  Create users    up     20210326083051  Add columuns to users    up     20210331121751  Create posts    up     20210331122545  Create post images [vagrant@vagrant ex_bbs]$ rails db:rollback STEP=2 == 20210331122545 CreatePostImages: reverting ================================= -- drop_table(:post_images)    -> 0.0027s == 20210331122545 CreatePostImages: reverted (0.0059s) ======================== == 20210331121751 CreatePosts: reverting ====================================== -- drop_table(:posts)    -> 0.0019s == 20210331121751 CreatePosts: reverted (0.0022s) ============================= [vagrant@vagrant ex_bbs]$ rails db:migrate:status database: ex_bbs_development  Status   Migration ID    Migration Name --------------------------------------------------    up     20210320060906  Create users    up     20210326083051  Add columuns to users   down    20210331121751  Create posts   down    20210331122545  Create post images  | 
					
マイグレーションファイルへの追記
マイグレーションファイルに新たなフィールドを1行追加する。
| 
					 1 2 3 4 5 6 7 8 9 10  | 
						class CreateDemoRecords < ActiveRecord::Migration[6.1]   def change     create_table :demo_records do |t|       t.string :name       t.integer :age       t.timestamps     end   end end  | 
					
再度マイグレート。
| 
					 1 2 3 4 5  | 
						[vagrant@localhost demo_app]$ rails db:migrate == 20210303071205 CreateDemoRecords: migrating ================================ -- create_table(:demo_records)    -> 0.0346s == 20210303071205 CreateDemoRecords: migrated (0.0348s) =======================  | 
					
MySQLで確認すると、テーブルが作成されている。
| 
					 1 2 3 4 5 6 7 8 9  | 
						mysql> show tables; +-----------------------+ | Tables_in_demo_app_db | +-----------------------+ | ar_internal_metadata  | | demo_records          | | schema_migrations     | +-----------------------+ 3 rows in set (0.00 sec)  | 
					
新たなフィールドが追加されているのが確認できる。
| 
					 1 2 3 4 5 6 7 8 9 10 11  | 
						mysql> desc demo_records; +------------+--------------+------+-----+---------+----------------+ | Field      | Type         | Null | Key | Default | Extra          | +------------+--------------+------+-----+---------+----------------+ | id         | bigint       | NO   | PRI | NULL    | auto_increment | | name       | varchar(255) | YES  |     | NULL    |                | | age        | int          | YES  |     | NULL    |                | | created_at | datetime(6)  | NO   |     | NULL    |                | | updated_at | datetime(6)  | NO   |     | NULL    |                | +------------+--------------+------+-----+---------+----------------+ 5 rows in set (0.00 sec)  |