ちょっと思いついたのでメモ。
例えばユーザーに関係する処理だけどドメイン的にユーザークラスに実装するのは…けどユーザーのインスタンスメソッドとして扱いたい。Concernだと他のConcernとの関係が…。
そんなときPOROなクラスをコンポジションすればテストもしやすいのでは、と。
ActiveRecordのafter_find
コールバックでコンポジションする。
user.rb
class User < ApplicationRecord
after_find do
@hoge = Hoge.new
end
delegate :fuga, :piyo, to: :@hoge
end
hoge.rb
class Hoge
def initialize
# 初期化処理
end
def fuga
# 複雑な処理
end
def piyo
# 複雑な処理
end
end
こうするとふつうにユーザーのインスタンスメソッドとして呼び出すことができるはず
sample.rb
user = User.find_by(email: "test@example.com")
user.fuga
user.piyo
メリット
- 役割が明確
- Hogeクラスに対してテストできる
- 他のConcernを気にしなくていい
デメリット
- 委譲するメソッドが多くなると大変そう
- これってただモデルの行数減らしたいだけじゃ…