タイトル: モデルの作成
SEOタイトル: Rails モデルの作成 完全ガイド(rails g model / マイグレーション / 型一覧 / リレーション references / バリデーション / db:migrate / 取り消し)
| この記事の要点 |
|
基本: rails g model
Rails で新しいモデル(テーブル)を作るときは generate model ジェネレータを使います。1 コマンドでモデルクラスとマイグレーション、テストファイルがまとめて生成されます。
# User モデル(name 文字列、age 整数)を作成
bin/rails generate model User name:string age:integer
# 省略形
rails g model User name:string age:integer
生成されるファイル例:
| ファイル | 役割 |
|---|---|
app/models/user.rb | モデルクラス(ApplicationRecord 継承) |
db/migrate/YYYYMMDDHHMMSS_create_users.rb | テーブル作成マイグレーション |
test/models/user_test.rb | モデル単体テスト |
test/fixtures/users.yml | テスト用フィクスチャ |
使えるカラム型
| 型 | 用途 | 例 |
|---|---|---|
string | 短い文字列(VARCHAR 255) | name:string |
text | 長文(TEXT) | body:text |
integer | 整数 | age:integer |
bigint | 大きな整数(ID 系) | views:bigint |
float / decimal | 小数 / 厳密小数 | price:decimal{10,2} |
boolean | 真偽値 | published:boolean |
date / datetime | 日付 / 日時 | published_at:datetime |
references | 外部キー(belongs_to も自動付与) | user:references |
:uniq 修飾 | UNIQUE インデックス付与 | email:string:uniq |
:index 修飾 | 通常インデックス付与 | slug:string:index |
リレーション付きで作る
references 型を使うと、外部キーカラム / インデックス / belongs_to の宣言までまとめて入ります。
# Post belongs_to User
bin/rails g model Post title:string body:text user:references
# Comment belongs_to Post and User
bin/rails g model Comment body:text post:references user:references# 生成されたモデル
class Post < ApplicationRecord
belongs_to :user
end
# 1 対多の反対側は手動で追加する
class User < ApplicationRecord
has_many :posts, dependent: :destroy
end
生成されたマイグレーション例
class CreateUsers < ActiveRecord::Migration[7.1]
def change
create_table :users do |t|
t.string :name, null: false
t.string :email, null: false
t.integer :age
t.timestamps # created_at / updated_at
end
add_index :users, :email, unique: true
end
end
DB へ反映する
# マイグレーションを実行(テーブル作成)
bin/rails db:migrate
# 状態確認
bin/rails db:migrate:status
# 1 つ戻す(誤りに気づいたとき)
bin/rails db:rollback
# 巻き戻して再実行
bin/rails db:migrate:redo
バリデーションを足す
DB 制約とは別に、モデル側でアプリ層のバリデーションを書きます。save 失敗時にエラーメッセージを返してくれます。
class User < ApplicationRecord
validates :name, presence: true, length: { maximum: 50 }
validates :email, presence: true,
uniqueness: { case_sensitive: false },
format: { with: URI::MailTo::EMAIL_REGEXP }
validates :age, numericality: { only_integer: true,
greater_than_or_equal_to: 0 },
allow_nil: true
end
やり直し: 取り消し方
| 状況 | 手順 |
|---|---|
まだ db:migrate していない | bin/rails destroy model User でファイル削除 |
| すでに反映済み | bin/rails db:rollback でテーブル削除 → destroy |
| カラム追加 / 削除 | 新しいマイグレーションを g migration で作成(過去ファイルは編集しない) |