Skip to content

Latest commit

 

History

History
58 lines (39 loc) · 3.19 KB

File metadata and controls

58 lines (39 loc) · 3.19 KB

多段ネスト (プロジェクト → フェーズ → タスクのような 3 段以上)

いつ使う: プロジェクト管理 (Project → Phase → Task)、組織図 (会社 → 部 → 課 → 社員)、ECサイト (注文 → 配送 → 配送アイテム) など、親→子→孫と 3 段以上の階層でレコードが連なる構造。

アプリの作り

プロジェクト → フェーズ → タスクの多段ネスト詳細画面

  • プロジェクトの詳細画面を開くと、フェーズの一覧が見える
  • フェーズの行 (or 詳細) を開くと、そのフェーズに紐づくタスクが見える
  • プロジェクト → フェーズ → タスクの順に深掘りできる

支えるデータ構造

projects                phases                          tasks
├── id    PK ←─────────┤ ├── id         PK ←──────────┤ ├── id           PK
├── name                │ ├── project_id  FK             │ ├── phase_id     FK
└── owner               ├ ├── phase_name                 ├ ├── title
                        ├ ├── start_date                 ├ ├── assignee
                        └ ├── end_date                   └ ├── is_done
                                                            └ ...

3 段ネスト: projects.idphases.project_idphases.idtasks.phase_id

モジュールとテーブルの対応

モジュール テーブル 役割 主な参照
Project Projects 親 (最上位) Phases (ListFieldPhase) で子を逆引き
Phase Phases 子 (中間) ProjectId で親を指す + Tasks (ListFieldTask) で孫を逆引き
Task Tasks 孫 (最深) PhaseId で親を指す

CLB ではこう作る

各層に ListField を置いて、その下の層を SearchCondition で逆引き表示する:

  • Project.PhasesSearchCondition: Phase.ProjectId == this.Id.Value で絞り込み
  • Phase.TasksSearchCondition: Task.PhaseId == this.Id.Value で絞り込み

各層は通常の CRUD モジュール。詳細画面に下層の ListField を置くことで、ドリルダウンの形になる。

標準パターン集の対応

サイドバー データ操作/多段ネストProject + Phase + Task

落とし穴

  • 各階層の Submit は基本的にその階層単独 (孫を含む全 Submit ではない)。トランザクション境界を意識する
  • 多段でネストが深くなると、画面が縦長になりがち。ListField は別画面遷移、DetailListField はインライン、と使い分ける

関連ドキュメント