2008-10-06 16 views
6

Ich habe eine Rails-Anwendung für die Projektverwaltung, wo es Projekt und Task-Modelle gibt. Ein Projekt kann viele Aufgaben haben, aber eine Aufgabe kann auch viele Aufgaben haben, ad infinitum.Rekursive Rails verschachtelte Ressourcen

verschachtelte Ressourcen, wir/Projekte haben können/1/Aufgaben/Projekte/1/Aufgaben/neu,/Projekte/1/Aufgaben/3/bearbeiten usw.

Wie aber stellen Sie die rekursive Art von Aufgaben RESTfully? Ich will nicht eine andere Ebene tiefer gehen, so vielleicht folgendes tun würde:

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

, die mir die folgenden Webadressen geben würde:

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

Oder vielleicht, wenn es um eine individuelle Aufgabe kommt, kann ich benutze einfach/tasks/45/edit

Ist das ein vernünftiges Design?

Cam

Antwort

3

es gibt keinen Grund sie sollten URLs decendant haben.

logisch:

 
/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/ 

gibt es keinen Grund IMHO die URLs assoziativ zu verlangen, Sie gehen zu müssen nicht Aufgabe 5 ist ein Kind der Aufgabe wissen, 3 Aufgabe zu bearbeiten 5.

6

Wenn Sie irgendwo über eine verschachtelte Route hinausgehen, wird dies im Allgemeinen als schlechte Idee betrachtet.

Von Seite 108 von Die Rails Way:

"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."

Jetzt mit diesen einige würden argumentieren, (die auf Seite 109 beschrieben wird), aber wenn Sie sprechen Verschachtelung Aufgaben mit Aufgaben, die es nur scheint nicht viel Sinn zu machen.

Ich würde Ihre Lösung auf eine andere Weise nähern und wie es oben erwähnt wurde, sollte ein Projekt viele Aufgaben haben, aber für eine Aufgabe viele Aufgaben zu haben scheint nicht korrekt und vielleicht sollten diese als Unteraufgaben umbenannt werden oder etwas in dieser Richtung.

2

Ich bin derzeit auf einem Projekt, das etwas Ähnliches tut. Die Antwort, die ich verwendet habe, war sehr elegant. Ich habe eine parent_id-Spalte hinzugefügt, die auf eine andere Aufgabe hinweist. Wenn Ihr Modell zu tun, stellen Sie sicher, dass die folgenden Funktionen ausführen:

belongs_to :project 
belongs_to :parent, :class_name => "Task" 
has_many :children, :class_name => "Task", :foreign_key => "parent_id" 

... und dann können Sie die Rekursion tun durch:

def do_something(task) 
    task.children.each do |child| 
    puts "Something!" 
    do_something(child) 
    end 
end  

Auf diese Weise können Sie Ihre Aufgaben, die von der übergeordneten Referenz oder durch seine Kinder. Wenn Sie Ihre Routen bearbeiten, greifen Sie immer auf eine einzelne Aufgabe zu:

, obwohl es möglicherweise ein Elternteil oder Kinder haben.

Stellen Sie nur sicher, dass Sie keine Aufgabe haben, deren Eltern das gleiche wie ihr Kind ist, oder Sie gehen in eine Endlosschleife, wenn Sie Ihre Rekursion durchführen, um alle Kinder zu finden.Sie können die Bedingung Ihren Validierungsskripten hinzufügen, um sicherzustellen, dass dies nicht der Fall ist.

Siehe auch: acts_as_tree

+0

mit 'acts_as_tree' auch funktionieren würde, und zusätzliche Vorteile. –

Verwandte Themen