はじめに
いろいろ理解が間違っている部分もあると思うので、問題あればご指摘していただければと思います。
Service層について
Modelの肥大化の対応として、複雑なロジックや、複数のモデルにわたる処理をService層に記載する方法があります。
使い方
フォルダ構成に関しては、app/services
に書いていきます。
ルールに関しては、チームによって違うと思いますが、自分の場合は下記の様にパブリックなメソッドはcall
のみにする形をとっています
class MetricsService
def initialize(user)
@user = user
end
def call
# 何かしらの処理
end
private
# プライベートメソッド
end
呼び出す際は
MetricsService.new(user).call
の様にして、呼び出します。
serviceをまとめる
おそらく、serviceを使っていると、結構serviceの量が増えてくると思います。
なので、モデルや機能などの単位でフォルダを切ると良いと思います。
例えば、usersに関するserviceをapp/services/users
内に書く場合は、
module Users
class CreateService
def initialize(current_user, params = {})
@current_user = current_user
@params = params.dup
end
def call
# 何かしらの処理
end
private
# プライベートメソッド
end
end
の様に定義して
::Users::CreateService.new(current_user, params).call
の様にして使います。
終わりに
とりあえず、いろんなロジックをservice層に押し込む感じで運用しているのですが、結構悪くなさそうです。
また、service層以外にも、モデルの肥大化の対策はあります。
こちらの記事が参考になると思います。