Skip to content

Instantly share code, notes, and snippets.

@hotatekaoru
Last active December 16, 2019 21:25
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hotatekaoru/97f4a61820ddf686707ee835a267557f to your computer and use it in GitHub Desktop.
Save hotatekaoru/97f4a61820ddf686707ee835a267557f to your computer and use it in GitHub Desktop.
Class namespace rule in rails project

1. データ取得系

下に行くほど、深度があがる

  • 1-1. View Model / View Object 画面やAPIなど、レスポンスに沿った内容をまとめたオブジェクト
  • 1-2. Collector Object / Finder Object 1つのテーブル、またはそれに関連するテーブルを取得するオブジェクト
  • 1-3. Query Object DBから取得する際に発行するクエリを定義するオブジェクト

1-1. View Model / View Object

  • 内容 レスポンスの返却値をまとめたオブジェクト。 RailsのViewに返すオブジェクトであれば、インスタンス変数ごとにメソッドを切って、取得処理をメソッド内で行う。

  • ネームスペース・クラス名 app/view_objects/コントローラー名/アクション名_view_object.rb app/view_objects/api/v1/コントローラー名/アクション名_view_object.rb

1-2. Collector Object / Finder Object

  • 内容 リクエストをもとに、単一・複数のデータを取得するオブジェクト

  • ネームスペース・クラス名

    • 返却値が単一のレコード app/models/adminとかmodel名とか/内容_finder.rb
    • 返却値が複数のレコード(ActiveRecord_Relation) app/models/adminとかmodel名とか/内容_collector.rb

Collectorから絞り込み/ソートを切り出している場合は 絞り込み: app/models/adminとかmodel名とか/内容_collector/filtering.rb ソート: app/models/adminとかmodel名とか/内容_collector/ordering.rb

1-3. Query Object

  • 内容 複雑なクエリ部分を切り出したオブジェクト

  • ネームスペース・クラス名 app/models/model名/内容_query.rbapp/models/内容_query.rb はNG)

2. データ更新系

下に行くほど、深度があがる

  • 2-1. Service Object 手続きの流れ(DB更新を含む複数の処理)を切り出したオブジェクト
  • 2-2. Creator / Updater Object validation、保存する内容のビルド、保存を行うオブジェクト
  • 2-3. Form Object validation、保存する内容のビルドを行うオブジェクト 2-2. Creator / Updater Objectと違い、保存自体は行わない
  • 2-4. Validate Object validationを行うオブジェクト

2-1. Service Object

  • 内容 ある手続きの流れを切り出したクラス。

  • ネームスペース・クラス名 app/models/内容_service.rb app/models/adminとかmodel名とか/内容_service.rb

2-2. Creator / Updater Object

  • 内容 リクエストに対するvalidationや、オブジェクトのビルドをしたあと、保存まで提供するオブジェクト (saveメソッドをクラス内に用意している)

  • ネームスペース・クラス名 app/models/adminとかmodel名とか/内容_creator.rb app/models/adminとかmodel名とか/内容_updater.rb

2-3. Form Object

  • 内容 リクエストに対するvalidationや、保存する内容のビルドをするオブジェクト (saveメソッドをクラス内に用意していない)

  • ネームスペース・クラス名 app/models/adminとかapiとか/クラス名_form.rb

2-4. Validate Object

  • 内容 カスタムバリデーターの定義。Railsが用意している ActiveModel::Validator を継承したクラスを app/validators 配下に定義する。

  • ネームスペース・クラス名

    • 複数クラスで使用する共通バリデーション(メアドチェックなど) app/validators/内容_validator.rb
    • 1つのクラスでのみ使用するバリデーション app/validators/model名(単数)/内容_validator.rb

3. 分類できない系

3-1. Value Object

  • 内容 あるオブジェクトから、何らかのデータを返却したい際に、その算出ロジックを切り出したオブジェクト。 参考: https://techracho.bpsinc.jp/hachi8833/2018_03_27/53794

  • ネームスペース・クラス名 app/models/何か階層入れる/クラス名やカラム名など(ケースbyケース)

3-2. Policy Object

  • 内容 あるオブジェクトの分岐部分を切り出したオブジェクト userクラスに対して権限が3つ以上ある時とかに使いたい。 参考: https://techracho.bpsinc.jp/hachi8833/2018_03_23/53523

  • ネームスペース・クラス名 app/models/model名(単数)/内容_policy.rb

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment