LoginSignup
7
8

More than 3 years have passed since last update.

はじめに

いろいろ理解が間違っている部分もあると思うので、問題あればご指摘していただければと思います。

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層以外にも、モデルの肥大化の対策はあります。

こちらの記事が参考になると思います。

7
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
8