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