Я в настоящее время нахожусь в проекте, который делает что-то подобное. Я использовал очень элегантный ответ: я добавил столбец parent_id, указывающий на другую задачу. При выполнении вашей модели обязательно выполните следующее:
belongs_to :project
belongs_to :parent, :class_name => "Task"
has_many :children, :class_name => "Task", :foreign_key => "parent_id"
... и тогда вы можете сделать рекурсию по:
def do_something(task)
task.children.each do |child|
puts "Something!"
do_something(child)
end
end
Таким образом, вы можете ссылаться на ваши задачи по его родителю или его потомкам. При выполнении ваших маршрутов вы всегда будете получать доступ к одной задаче
/project/:project_id/task/:task_id
хотя у него могут быть родители или дети.
Просто убедитесь, что у вас нет задачи, у которой родительский элемент совпадает с дочерним, иначе вы попадете в бесконечный цикл, когда выполняете рекурсию, чтобы найти всех детей. Вы можете добавить условие в свои сценарии проверки, чтобы убедиться, что оно не выполняется.
Смотри также: acts_as_tree