2012-05-29 55 views
0

我有屬於項目,任務和子任務的討論(多態)。任務屬於項目,子任務屬於任務。遞歸遍歷Rails關係以查找特定父類

我有用戶通過名爲'突觸'的連接表連接到項目。如果用戶具有領導者(AKA管理員)權限,則突觸模型具有user_id,project_id和布爾型字段,稱爲:領導者信號。

對於要關閉(完成)討論的用戶,他需要成爲當前項目的負責人或需要成爲該討論的創建者。這是在討論控制器「完成」方法:

33 def finish 
34  if current_user.leader? || current_user.discussions.include?(@discussion) 
35  @discussion.update_attribute(:finished, true) 
36  redirect_to polymorphic_path([@parent, Discussion]) 
37  flash[:notice] = "Discussion '#{@discussion.name}' finished" 
38  else 
39  flash[:alert] = 'You must be an admin to do that' 
40  end 
41 end 

由於用戶模型中沒有領導者的屬性本身,我需要找到當前用戶和項目之間的對應突觸(至極確實有領袖布爾字段,顯示用戶是否可以結束討論)。下面是我在application_controller的方法找到突觸:

9 def find_synapse(user,project) 
10  user.synapses.find_by_project_id(project) 
11 end 

爲了找到突觸,我需要找到項目。到目前爲止,我可以找到討論的父母,可以是項目,任務或子任務模型。

我看到它的方式,我需要通過父母迭代,而不是停止,當父母是類Project(for循環?)。這個怎麼做?這是最好的辦法嗎?順便說一句,我嘗試使用開關大小寫(當@ parent.class是任務,做到這一點,當類是項目,做到這一點),但似乎hackish,我沒有管理它無論如何工作。

回答

1

切換,使得

class Project 
    def owning_project 
    self 
    end 
end 

class Task 
    def owning_project 
    project 
    end 
end 

class Subtask 
    def owning_project 
    task.owning_project 
    end 
end 

然後你可以在您的討論的父母上撥打owning_project並取回相關項目。在某種程度上,這與您的案例陳述幾乎相同,但是使用繼承系統爲您進行切換。

+0

謝謝。這是最好的做法呢?是不是有一個循環會做這一切? – oFca

+0

不要以爲這裏有什麼內置的東西。 –

+0

我知道......這種擁有產品的方法非常性感,我會繼續......只是認爲有一些方法可以用for循環來做到這一點,以避免在每個模型中定義這種方法。 – oFca

1

如果你想切換情況下工作,它實際上有如果在項目,任務,子任務定義一個方法owning_product@parent

case @parent 
when Task 
    ... 
when Project 
    ... 
when Subtask 
    ... 
end 
+0

謝謝。這是不是有點hackish?似乎有更優雅更好的方法... – oFca