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を併用する感じのようです。

終わりに

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

システム開発に興味をお持ちの方は、お気軽にご相談ください。初回のご相談は無料です。

相談する

ブログ一覧へ