如何在Rails中对关联的has_many记录执行if语句

时间:2012-03-02 13:04:39

标签: ruby-on-rails

在Rails 3.2应用程序中,我有一个模型项目,它有许多任务。每个任务都有一个:status字段,它是一个整数,如下所示

1=Normal
2=Urgent

在Project show视图中,如果任何相关任务被标记为紧急,我想显示文本警报。

如果状态字段在Project模型中,我会这样做:

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

如何设置一个类似的if语句,它将遍历所有相关的任务,如果至少有一个任务被标记为紧急,则返回true?

我不确定我应该为这种功能搜索什么术语。或许我不是以正确的方式看问题。对于正确方向的指示,我将不胜感激。

由于

2 个答案:

答案 0 :(得分:3)

Project中的此方法将执行此操作:

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

如果您将@project设置为您正在查看的项目,那么您可以这样做:

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

在回答您的评论时添加了下一位。 Project中的此方法将返回特定项目中任何任务的最高优先级集(示例中为最小数字):

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

然后,您可以在视图中切换它们:

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

答案 1 :(得分:0)

我想你想检查一个项目是否有一些紧急任务要完成。如果是这样,我认为实现这一目标的最佳方法是在Project模型中创建新方法,如下所示:

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

假设您已在任务模型中将状态定义为常量,如果不是仅将Task :: URGENT替换为2。

因此,在您看来,您只需要这样做:

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