RailsのFindersに検索ロジックをまとめる
2021.04.04 Ruby on Rails
GitLabのソースコードで、モデルが肥大化しないように複雑な検索ロジックをfindersフォルダにまとめているやり方を紹介します。UserProjectsFinderの例と、serviceクラスとfindersの併用について。
はじめに
GitLabのプロジェクトではモデルが肥大化しない様に、複雑な検索ロジックに関してfindersフォルダをきって使っている様でした。
Finders
app/finders フォルダに複雑な検索ロジックがまとめられています。複数のモデルが関わってくるような検索に使われている様です。
使い方
Userが持つProjectを特定の条件で検索する場合、モデルに projects_filtered_by を書く代わりに、UserProjectsFinder クラスを用意し、initialize(user, params) と execute メソッドで検索ロジックを実装します。基本的にパブリックメソッドはexecuteのみにします。呼び出しは UserProjectsFinder.new(user, params).execute の様にできます。
ちなみに
GitLabのヘッダー検索のように複雑な場合は、serviceクラスに検索ロジックを記載し、その中でfindersを呼び出している感じでした。検索ロジックはfindersに記載し、渡されるパラメーターが複雑な場合や検索範囲が広い場合はserviceとfindersを併用する感じのようです。
終わりに
プロジェクトでこれを統一すると、結構モデルがきれいになるんじゃないかなと思っています。