2012-03-02 84 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