モデル(ActiveRecord)の作成
Rails における “モデル” は データベースのテーブルと 1 対 1 で対応する Ruby クラス です。ActiveRecord が ORM(Object-Relational Mapping)として、テーブル行を Ruby オブジェクトへ、SQL をメソッド呼び出しへ橋渡しします。以下では「モデルの作成」手順と実装上のポイントを、概念 → コマンド → 生成物 → 拡張 という流れで整理します。
1. 設計フェーズ:ドメインとスキーマを決める
-
ドメインモデルの洗い出し
アプリの主要な名詞(User, Article, Comment など)をリストアップし、エンティティ間の関係(1 対 多、多 対 多)を紙に描く。 -
テーブル設計
-
カラム名: snake_case(
title,published_at) -
型:
string,text,integer,decimal,datetime,boolean,referencesなど -
制約: NOT NULL や UNIQUE を必要最小限に
-
設計段階で正規化とインデックスの検討を済ませておくと、後のリファクタリングコストが下がります。
2. モデルとマイグレーションの生成
-
モデル名は単数形・CamelCase(例:
Article)。Rails が自動で複数形テーブル名articlesを推測します。 -
生成物
-
article.rb: 空クラス。ここにバリデーションや関連付けを追加する。
-
create_articles.rb: スキーマ定義を含むマイグレーション。
-
例
-
user:referencesは外部キーuser_idと自動インデックスを追加し、belongs_to :userを記事モデルに定義します。
3. マイグレーションの実行
-
schema.rb(またはstructure.sql)が更新され、スキーマの単一情報源として機能。 -
チーム開発では
db/schema.rbを Git にコミットし、環境差異をなくします。
変更をロールバックしたい場合は
bin/rails db:rollback STEP=1。STEP を省略すると 1 ステップ戻します。
4. Rails コンソールで動作確認
-
SQL を直接書かずにチェーンメソッドで検索可能。
-
コンソールはバリデーションやコールバックも通るため、実運用と同一コードパスで検証できる。
5. モデル実装を充実させる
| 目的 | 記述例 | 説明 |
|---|---|---|
| バリデーション | validates :title, presence: true, length: { maximum: 50 } |
DB 制約では捕捉しづらいビジネスルールをアプリ層で保証 |
| 関連付け | belongs_to :user has_many :comments, dependent: :destroy |
親子関係・多対多(has_many :tags, through: :taggings)を定義 |
| スコープ | scope :published, -> { where.not(published_at: nil) } |
よく使う条件をチェーン可能なメソッドとして再利用 |
| enum | enum status: { draft: 0, published: 1, archived: 2 } |
整数カラムをシンボルで読み書き |
| コールバック | before_save :set_slug |
保存前にスラッグを自動生成など副作用処理 |
6. テストの準備
-
test/models/article_test.rb(または RSpec の場合はspec/models/article_spec.rb)に-
バリデーションの成立/不成立
-
関連付けの存在
-
スコープやクラスメソッドの戻り値
を記述し、挙動の回帰確認を自動化。
-
7. 生成後の設計変更に対処する
-
カラム追加・削除
-
型変更・インデックス追加
マイグレーション DSL (change_column,add_index) を使う。 -
データ移行
up/downメソッドでArticle.reset_column_informationを呼びつつバッチ更新。
履歴を汚さないために マイグレーションは “追加で積む” が原則。既存ファイルの手動編集は避ける。
8. よくある落とし穴
| 症状 | 原因 | 対策 |
|---|---|---|
PG::UndefinedTable |
マイグレーション忘れ | bin/rails db:migrate で最新化 |
uninitialized constant |
モデル名・ファイル名不整合 | CamelCase と snake_case の規約を遵守 |
| 外部キー制約違反 | belongs_to 先がない |
optional: true を付けるかデータ投入順序を調整 |
| N+1 クエリ | 関連先を都度取得 | includes / preload で eager-load |
まとめ
-
モデル作成は
generate model→ マイグレーション実行 の 2 ステップ。 -
ActiveRecord は 規約 > 設定 の思想でファイル名・テーブル名を自動推測するため、命名規則を守ると記述量が最小化される。
-
モデルに バリデーション・関連付け・スコープ を実装してドメイン知識を閉じ込める。
-
スキーマ変更は新規マイグレーションを追加し、バージョン管理で一元化。
これらを押さえておくことで、Rails アプリのデータ層は堅牢かつ拡張しやすい構造になります。
ChatGPT4o 生成日:2025/06/21