読んで欲しい人
- Railsで自分のテーブルを参照してリレーションを組みたい人
- 例:Userモデル内でそれぞれ役職があって、その関係性を表現したい!
- 上司と部下
- プロジェクトとタスク
- 過去の俺
今回のケース
- タスク管理アプリでTaskがTaskを無限に持てるようにしたいなぁ
やり方
class Task < ApplicationRecord
has_many: sub_tasks, class_name: 'Task', foreign_key: 'parent_id', dependent: :destroy
belongs_to :parent, class_name: 'Task', optional: true
end
解説
has_many: sub_tasks, class_name: 'Task', foreign_key: 'parent_id', dependent: :destroy
- TaskはTaskを複数持てるをそのまま、has_many :tasksと記述すると分かりづらいので
has_many: sub_tasks
で名前を変更している -
class_name: 'Task'
でTaskクラスを参照するように指定。実際にはsub_task
モデルなど存在しないので - sub_taskは
parent
として外部キー(親タスク)を指定するforeign_key: 'parent_id'
-
dependent: :destroy
親タスクが消えたが、小タスクも消える
belongs_to :parent, class_name: 'Task', optional: true
-
belongs_to :parent
Taskは親タスクに所属している -
class_name: 'Task'
実際はparentなんてないからちゃんとTaskクラスを指定する -
optional: true
最初に追加するTaskは親タスクが存在しないので、親がいなくてもTaskは生成することができる
感想
- 意外とタスクを無限に追加できるタスク管理アプリは考慮しなくてはいけないことが多い(経験不足)
- じゃあコントローラとかどう書くのかはわからないので、またできたら書きます
参考