Да, вы рассчитываете на ВСЕ проекты, а не только на текущий проект.
То, что вы хотите ...
<% stages = Stage.where(project_id: project.id) %>
обратите внимание, что мы используем project.id
который ссылается на текущий проект в каждом l oop, а не @projects
, который является всеми проектами.
Лучше может быть ...
<% stages = project.stages %>
А с точки зрения производительности лучше дать базе данных подсчитать ...
<% stage_counters = project.stages.where('planned_end_date < ?', Date.today).where(status: [0,2]).count %>
Если вы Собираетесь выполнять сложные логические тесты, это помогает использовать скобки, чтобы убедиться, что вы получили правильный порядок приоритета,
<% @stages.each{|s| stage_counter += 1 if (s.planned_end_date.past? && s.status == 0) || (s.planned_end_date.past? && s.status == 2)} %>
Вы можете сделать то же самое с задачами и подзадачами, определив отношения в модель ...
has_many :stages, dependent: :destroy
has_many :tasks, through: :stages
has_many :sub_tasks, through: :tasks
Это позволит вам сделать project.tasks
и project.sub_tasks
Обратите внимание, что вы можете переместить эти вычисления в модель ...
class Project
def incomplete_stages_count
stages.where('planned_end_date < ?', Date.today).where(status: [0,2]).count
end
Что лучше и позволит вам сделать ...
<% project.incomplete_stages_count %>
, но даже тогда это означает, что модель проекта должна знать, что делает стадию незавершенной, что является головной болью, если вы когда-нибудь измените бизнес-правила, так что, возможно, создайте область в Stage
class Stage
scope :incomplete, -> {where('planned_end_date < ?', Date.today).where(status: [0,2])}
end
И в Project
class Project
def incomplete_stages_count
stages.incomplete.count
end
end