search
LoginSignup
7

More than 1 year has passed since last update.

Organization

RailsにService層を導入

はじめに

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

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

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

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
What you can do with signing up
7