0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Rails ActiveRecordの自己結合:タスク管理アプリ

Posted at

読んで欲しい人

  • 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は生成することができる

感想

  • 意外とタスクを無限に追加できるタスク管理アプリは考慮しなくてはいけないことが多い(経験不足)
  • じゃあコントローラとかどう書くのかはわからないので、またできたら書きます

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?