はじめに
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)
の様にできます。
ちなみに
GitLabの、この↑ヘッダーの検索に関しては、結構複雑な検索ロジックになると思うのですが、
service
クラスに検索ロジックを記載して、そのservice
クラス内でfinders
を呼び出している感じでした。
なので、基本的には検索ロジックはfinders
に記載して、渡されるパラメーターが複雑になる場合や、検索範囲の広いロジックの場合は
service
クラスとfinders
を併用する感じなんでしょうか
終わりに
プロジェクトでこれを統一すると、結構モデルがきれいになるんじゃないかなと思っています。