RailsのFindersに検索ロジックをまとめる

はじめに

GitLabのソースコードを読んでいて見つけたのですが、

GitLabのプロジェクトではモデルが肥大化しない様に、複雑な検索ロジックに関して

findersフォルダをきって、使っている様でした。

それに関してまとめます。

Finders

GitLabのプロジェクトではapp/findersフォルダに複雑な検索ロジックがまとめられています。

おそらく、複数のモデルが関わってくる様な検索に関して使われている様です。

使い方

Userが持つProjectを、特定の条件で検索する様な場合にモデルに書く場合下記の様になると思います。

class User ApplicationRecord
  def projects_filtered_by(filter)
    # 検索ロジック
  end
end

projects = user.projects_filtered_by(params)

これを、Findersを使う場合

class UserProjectsFinder
  def initialize(user, params = {})
    @user = user
    @params = params
  end

  def execute
    # 何かしらの検索ロジック
  end

  private

  # 基本的にパブリックメソッドはexecuteのみ
end

projects = UserProjectsFinder(user, params)

の様にできます。

ちなみに

スクリーンショット 2020-12-02 21.09.35.png

GitLabの、この↑ヘッダーの検索に関しては、結構複雑な検索ロジックになると思うのですが、

serviceクラスに検索ロジックを記載して、そのserviceクラス内でfindersを呼び出している感じでした。

なので、基本的には検索ロジックはfindersに記載して、渡されるパラメーターが複雑になる場合や、検索範囲の広いロジックの場合は

serviceクラスとfindersを併用する感じなんでしょうか

終わりに

プロジェクトでこれを統一すると、結構モデルがきれいになるんじゃないかなと思っています。

コメントを残す

メールアドレスが公開されることはありません。