ファットモデルを解消するためにPOROを活用する

2025/08/05

POROは、Plain Old Ruby Objectの略。

データベースとの直接的なやり取り(User.find() や User.create()、user.save() のようなActive Recordのメソッドを呼び出してSQLクエリを直接発行するなど)を行わないビジネスロジックは、POROを使用する。
=データベースに変更を加えない場合はPOROが使用できる。

# app/models/user/account_activator.rb
class User::AccountActivator
  def initialize(token:)
    @token = token
  end

  def call
    user = User.find_by(activation_token: @token)
    return false unless user && user.pending?

    user.transaction do
      user.update!(status: :active, activation_token: nil)
      # 外部の通知サービスを呼び出す(Notifierは別途定義されたPOROかActionMailer)
      Notifier.send_welcome_email(user) 
    end
    true
  rescue => e
    false
  end
end
# app/models/user.rb
class User < ApplicationRecord
  # ユーザーモデルの関連付けやバリデーション

  def activate_account(token)
    User::AccountActivator.new(token: token).call
  end
end

関連ページ

ファットモデルを解消するためにconcernsを活用する

バックリンク