LoginSignup
1
2

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-12-02

はじめに

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を併用する感じなんでしょうか

終わりに

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

1
2
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
1
2