Как выполнить операторы if на связанных записях has_many в Rails - PullRequest
0 голосов
/ 02 марта 2012

В приложении Rails 3.2 у меня есть модельный проект, в котором много задач.Каждая задача имеет поле: состояние, которое представляет собой целое число, как показано ниже

1=Normal
2=Urgent

В представлении «Показать проект» я хочу отобразить текстовое предупреждение, если какая-либо из связанных задач помечена как срочная.

Если бы поле состояния находилось в модели проекта, я бы сделал что-то вроде этого:

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

Как мне создать аналогичный оператор if, который будет циклически проходить по всем связанным задачам и возвращать trueесли хотя бы одно задание помечено как срочное?

Я не уверен, какие термины мне следует искать для такого рода функций.Или, может быть, я не смотрю на проблему правильно.Я был бы признателен за любые указатели в правильном направлении.

Спасибо

Ответы [ 2 ]

3 голосов
/ 02 марта 2012

Этот метод в 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 %>
0 голосов
/ 02 марта 2012

Полагаю, вы хотите проверить, есть ли у проекта срочная задача, которую нужно выполнить.Если это так, то я думаю, что лучший способ добиться этого - создать новый метод в модели проекта, что-то вроде этого:

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 %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...