2008-10-06 168 views
6

我有一個Rails應用程序,用於有Project和Task模型的項目管理。一個項目可以有很多任務,但任務也可以有很多任務,無限的。遞歸Rails嵌套資源

使用嵌套的資源,我們可以有/項目/ 1 /任務/項目/ 1 /任務/新/項目/ 1 /任務/ 3 /編輯等

但是,你怎麼代表RESTfully的遞歸任務性質?我不想去另一個層次深,那麼也許下面會做:

map.resources :tasks do |t| 
    t.resources :tasks 
end 

這將使我下面的網址:

/tasks/3/tasks/new 
/tasks/3/tasks/45/edit 

或者也許當它涉及到一個單獨的任務,我可以只是使用/任務/ 45 /編輯

這是一個合理的設計?

凸輪

回答

3

沒有理由他們應該有被告URLS。

邏輯:

 
/projects/1 --> project 1 
/projects/1/edit (etc) 
/tasks/1  --> task 1 
/project/1/tasks --> task list for project 1 
/project/1/tasks/new 
/project/1/tasks/1/edit -> /tasks/5/edit (redundancy) 
/project/1/tasks/1 -> redirect to /tasks/1 
/tasks/1/project -> redirect to /projects/1 
/tasks/3/tasks --> list of tasks that are children tasks of task 3 
/tasks/3/tasks/5 -> redirect /tasks/5/ (because you don't really need to have a recursive URL) 
/tasks/5/parents -> list of tasks that are parents of tasks 3 
/tasks/5/parents/3 -> redirect /tasks/3/ 

沒有理由恕我直言,要求的URL是關聯的,你不會需要知道任務5是任務3的子編輯任務5.

6

在單個嵌套路線之外的任何地方通常被認爲是一個壞主意。

108頁Rails的方式

"Jamis Busk a very influential figure in the Rails community, almost as much as David himself. In February 2007, vis his blog, he basically told us that deep nesting was a _bad_ thing, and proposed the following rule of thumb: Resources should never be nested more than one level deep."

現在有些人會用這個爭論(這是109頁上的討論),但是當你在談論嵌套任務與任務,它只是似乎沒有多大意義。

我會用不同的方式處理你的解決方案,就像上面提到的那樣,一個項目應該有很多任務,但是對於任務有很多任務看起來不正確,也許這些任務應該被重新命名爲子任務或類似的規定。

2

我目前正在做一個類似的項目。我使用的答案非常優雅,我添加了一個指向另一個任務的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

+0

使用`acts_as_tree`將工作太,並給予額外的好處。 – 2008-10-06 23:42:13