2012-03-02 54 views
0

在Rails 3.2應用程序中,我有一個模型Project,它有許多任務。每個任務都有一個:狀態字段,它是一個整數如下如何在Rails中關聯has_many記錄執行if語句

1=Normal 
2=Urgent 

在項目顯示視圖,我想如果有任何關聯的任務被標記爲緊急顯示文字提示。

如果狀態字段是項目模型中,我會做這樣的事情:

<% if Project.status == 2 %> 
    <div class="alert">URGENT TASKS!</div> 
<% end %> 

我怎樣才能建立一個類似的if語句,這將循環通過所有相關的任務,並返回如果爲真至少有一項任務被標記爲緊急?

我不確定我應該在這類功能上搜索什麼條款。或者,我可能沒有正確地看待問題。我會很感激任何指向正確方向的指針。

感謝

回答

3

這種方法在項目將做到這一點:

def urgent? 
    tasks.detect{|t| t.status==2} 
end 

然後,你可以做,如果你有@project集到項目你看:

<% if @project.urgent? %> 
    ...whatever ... 
<% end %> 

接下來這一點被添加回答您的評論。這種方法在項目將返回最高優先級的設定(在你的榜樣最低編號)的任何任務在一個特定的項目:

<% case @project.highest_priority 
    when 1 %> 
    ...priority 1 stuff... 
<% when 2 %> 
    ...priority 2 stuff... 
<% when 3 %> 
    ...and so on... 
<% end %> 
+0

感謝kevtufc,這是一個很好的解決方案。我將如何擴展它以涵蓋更多選項。例如,具有更多狀態的例如'1 =高,2 =醫學,3 =低,4 =非常低...等等,我想顯示一條消息,如果有高的狀態,如果不是那麼我想顯示一條消息,如果有中等身份,如果不是......我是否需要爲每個條件創建一個單獨的方法 - 「def high ?, def med ?, def low?」 - 還是有更好的方法可以做到這一點? – 2012-03-02 19:34:47

+0

我已經擴展了我的答案來解決這個問題。 – 2012-03-03 11:13:48

+0

謝謝@kevtufc,這是一個非常好的解決方案! – 2012-03-03 12:47:06

0

我:

def highest_priority 
    tasks.map{|t| t.status}.min 
end 

您可以在它們之間在視圖然後切換猜測你想檢查一個項目是否有一些緊急任務要完成。如果多數民衆贊成的情況下,我認爲最好的方式來實現,這將是在項目模型來創建新的方法,這樣的事情:

def has_urgent_task? 
    tasks.map(&:status).include?(Task::URGENT) 
end 

假設你定義了你的狀態在你的任務模型常數,如果不只是更換任務::迫切2.

那麼在你看來,你只需要做到這一點:

<% if @project.has_urgent_task? %> 
    <div class="alert">URGENT TASKS!</div> 
<% end %> 
+0

感謝cicloon,很好的解決方案。我用kevtufc的答案去,因爲它似乎是一個優雅的解決方案。你的工作也是:)。謝謝您的幫助 – 2012-03-03 03:43:32