カテゴリ: Rails 更新日: 2026/01/23

RailsモデルとActive Record基礎|業務ロジックの置き場所を理解してモデル肥大化を防ぐ設計(Service・Query Object)

業務ロジックの置き場所:モデル肥大化を防ぐ設計(Service/Query Object)
業務ロジックの置き場所:モデル肥大化を防ぐ設計(Service/Query Object)

先生と生徒の会話形式で理解しよう

生徒

「Railsのモデルに処理を書いていたら、だんだん長くなって読めなくなりました……」

先生

「それはモデル肥大化と呼ばれる状態ですね。Railsではよくある悩みです。」

生徒

「業務ロジックって、どこに書けばいいんですか?」

先生

「ServiceやQuery Objectを使うと、役割ごとに整理できますよ。」

1. 業務ロジックとは?Rails初心者が混乱しやすいポイント

1. 業務ロジックとは?Rails初心者が混乱しやすいポイント
1. 業務ロジックとは?Rails初心者が混乱しやすいポイント

業務ロジックとは、アプリの中で 「こういう条件のときは、こう処理する」 といったルールのことです。 例えば、注文が確定したら在庫を減らす、 会員ランクによって割引率を変える、 こうした判断の流れが業務ロジックです。

Rails初心者の多くは、 これらの処理をすべてモデルに書いてしまいます。 最初は問題ありませんが、 機能が増えるほどモデルが太っていきます。

2. モデル肥大化とは?なぜ問題になるのか

2. モデル肥大化とは?なぜ問題になるのか
2. モデル肥大化とは?なぜ問題になるのか

モデル肥大化とは、 1つのモデルに大量の処理が詰め込まれ、 何をしているクラスなのか分からなくなる状態です。

例えるなら、 台所・リビング・寝室がすべて 1つの部屋に詰め込まれた家のようなものです。 使えなくはありませんが、とても不便です。

コードも同じで、 読みにくく、修正しづらく、 バグが生まれやすくなります。

3. まずはモデルの役割を整理しよう

3. まずはモデルの役割を整理しよう
3. まずはモデルの役割を整理しよう

Railsのモデルの主な役割は、 データの保存や取得、 バリデーションなどの基本的な責務です。

「データそのものに近い処理」はモデルに、 「流れや判断が多い処理」は 別の場所に分ける意識が大切です。


class Order < ApplicationRecord
  validates :total_price, presence: true
end

このようなシンプルな内容であれば、 モデルに書いても問題ありません。

4. Serviceオブジェクトとは?処理をまとめる専用クラス

4. Serviceオブジェクトとは?処理をまとめる専用クラス
4. Serviceオブジェクトとは?処理をまとめる専用クラス

Serviceオブジェクトは、 「1つの目的の処理」を担当するクラスです。 注文確定処理やメール送信処理など、 まとまりのある業務ロジックを切り出します。

これは、料理で言うと 「調理専門の人」に仕事を任せるイメージです。 モデルは材料管理に集中できます。


class OrderCompleteService
  def initialize(order)
    @order = order
  end

  def call
    @order.update(status: "completed")
  end
end

このように処理を分けることで、 コードの見通しが良くなります。

5. Query Objectとは?検索ロジックの整理役

5. Query Objectとは?検索ロジックの整理役
5. Query Objectとは?検索ロジックの整理役

Query Objectは、 複雑な検索条件をまとめるためのクラスです。 Active Recordのクエリが 長くなってきたときに活躍します。

例えるなら、 条件検索の「専門フィルター係」です。


class ActiveUsersQuery
  def self.call
    User.where(active: true)
  end
end

モデルから検索ロジックを外すことで、 Userモデルがスッキリします。

6. ServiceとQuery Objectを使うと何が良いのか

6. ServiceとQuery Objectを使うと何が良いのか
6. ServiceとQuery Objectを使うと何が良いのか

処理の置き場所を分けることで、 コードの役割がはっきりします。 「何をするクラスなのか」が 名前を見るだけで分かるようになります。

また、テストもしやすくなり、 修正の影響範囲も小さくなります。 Railsアプリが成長しても、 破綻しにくい設計になります。

7. Rails初心者が意識したい設計の考え方

7. Rails初心者が意識したい設計の考え方
7. Rails初心者が意識したい設計の考え方

最初から完璧な設計を目指す必要はありません。 ただし、 「モデルが長くなってきたな」 と感じたら、 責務を分けるサインです。

ServiceやQuery Objectは、 モデル肥大化を防ぐための 心強い味方です。 RailsとActive Recordを学ぶ中で、 少しずつ取り入れていきましょう。

関連記事:
カテゴリの一覧へ
新着記事
New1
Ruby
Rubyプログラムの実行方法まとめ:スクリプト・REPL・Shebang・実行権限の基本
New2
Rails
アセットの全体像をやさしく解説!importmap・jsbundling・cssbundlingの選び方
New3
Rails
Rails Action Cable入門|チャネル・接続・サブスクライブの基本を図解でやさしく解説
New4
Rails
RailsのScaffoldは使うべき?初心者向けにメリット・デメリット・安全な使い方と代替案を解説!
人気記事
No.1
Java&Spring記事人気No1
Ruby
Rubyのreduceとinject入門!合計計算や集計を初心者向けに分かりやすく解説
No.2
Java&Spring記事人気No2
Ruby
Rubyの文字列エンコーディング完全ガイド!Encoding・force_encoding・encodeを初心者向け解説
No.3
Java&Spring記事人気No3
データベース
PostgreSQLのWHERE句を徹底解説!初心者でもわかるSQLデータ抽出の基本
No.4
Java&Spring記事人気No4
Rails
Rails認可をやさしく理解!CanCanCan入門:ability.rbの定義とload_and_authorize_resource実例
No.5
Java&Spring記事人気No5
Ruby
Rubyで比較演算子を完全解説!==・===・<=>・eql? の使い分け
No.6
Java&Spring記事人気No6
Ruby
OpenSSL関連エラーの直し方を完全解説!証明書・ビルドオプション・brew対策まとめ
No.7
Java&Spring記事人気No7
データベース
MySQLとは?初心者向けにデータベースの特徴とできることをやさしく解説
No.8
Java&Spring記事人気No8
データベース
PostgreSQLのCTE(WITH句)完全解説!複雑なSQLを整理して読みやすくする書き方