モデル(ActiveRecord)の作成

Rails における “モデル” は データベースのテーブルと 1 対 1 で対応する Ruby クラス です。ActiveRecord が ORM(Object-Relational Mapping)として、テーブル行を Ruby オブジェクトへ、SQL をメソッド呼び出しへ橋渡しします。以下では「モデルの作成」手順と実装上のポイントを、概念 → コマンド → 生成物 → 拡張 という流れで整理します。


1. 設計フェーズ:ドメインとスキーマを決める

  1. ドメインモデルの洗い出し
    アプリの主要な名詞(User, Article, Comment など)をリストアップし、エンティティ間の関係(1 対 多、多 対 多)を紙に描く。

  2. テーブル設計

    • カラム名: snake_case(title, published_at

    • 型: string, text, integer, decimal, datetime, boolean, references など

    • 制約: NOT NULLUNIQUE を必要最小限に

設計段階で正規化とインデックスの検討を済ませておくと、後のリファクタリングコストが下がります。


2. モデルとマイグレーションの生成

bash
bin/rails generate model <モデル名> <カラム名:型> <カラム名:型> ...
  • モデル名は単数形・CamelCase(例: Article)。Rails が自動で複数形テーブル名 articles を推測します。

  • 生成物

    bash
    app/models/article.rb db/migrate/20250621175900_create_articles.rb test/models/article_test.rb
    • article.rb: 空クラス。ここにバリデーションや関連付けを追加する。

    • create_articles.rb: スキーマ定義を含むマイグレーション。

bash
bin/rails g model Article title:string body:text published_at:datetime user:references
  • user:references は外部キー user_id と自動インデックスを追加し、belongs_to :user を記事モデルに定義します。


3. マイグレーションの実行

bash
bin/rails db:migrate
  • schema.rb(または structure.sql)が更新され、スキーマの単一情報源として機能。

  • チーム開発では db/schema.rb を Git にコミットし、環境差異をなくします。

変更をロールバックしたい場合は bin/rails db:rollback STEP=1。STEP を省略すると 1 ステップ戻します。


4. Rails コンソールで動作確認

bash
bin/rails console
ruby
article = Article.create!(title: "初めての投稿", body: "本文...", user: User.first) Article.where(title: "初めての投稿").first
  • 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. 生成後の設計変更に対処する

  1. カラム追加・削除

    bash
    bin/rails g migration AddViewsCountToArticles views_count:integer bin/rails g migration RemoveArchivedFromArticles archived:boolean
  2. 型変更・インデックス追加
    マイグレーション DSL (change_column, add_index) を使う。

  3. データ移行
    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