概要
Railsでは、データベースのテーブルをモデルを通して扱う。そのための開発時点での操作は以下のとおり。
- モデルの生成・操作
- マイグレーションによるテーブルの生成・操作
モデルの生成・削除
モデルの生成
テーブルに対して1つのモデルを生成する。
基本形は以下のコマンド。
rails generate model model_name
生成時にテーブルのフィールド名とフィールドの型を指定する場合(フィールド指定の間はスペース)。
rails generate model model_name col1:type col2:type ...
フィールドの型
primary_key
binary, boolean
date, datetime, time, timestamp
decimal, float, integer
string, 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) |