diff --git a/app/models/project.rb b/app/models/project.rb index dc1709d84..b75588609 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -83,6 +83,10 @@ class Project < ActiveRecord::Base after_update :update_versions_from_hierarchy_change, :if => Proc.new {|project| project.saved_change_to_parent_id?} before_destroy :delete_all_members + attr_accessor :cached_start_date + + attr_accessor :cached_due_date + scope :has_module, lambda {|mod| where("#{Project.table_name}.id IN (SELECT em.project_id FROM #{EnabledModule.table_name} em WHERE em.name=?)", mod.to_s) } @@ -641,7 +645,7 @@ class Project < ActiveRecord::Base # The earliest start date of a project, based on it's issues and versions def start_date @start_date ||= [ - issues.minimum('start_date'), + cached_start_date || issues.minimum('start_date'), shared_versions.minimum('effective_date'), Issue.fixed_version(shared_versions).minimum('start_date') ].compact.min @@ -650,7 +654,7 @@ class Project < ActiveRecord::Base # The latest due date of an issue or version def due_date @due_date ||= [ - issues.maximum('due_date'), + cached_due_date || issues.maximum('due_date'), shared_versions.maximum('effective_date'), Issue.fixed_version(shared_versions).maximum('due_date') ].compact.max @@ -853,6 +857,13 @@ class Project < ActiveRecord::Base # Yields the given block for each project with its level in the tree def self.project_tree(projects, options={}, &block) + + start_dates = Issue.where(project_id: projects).group(:project_id).minimum(:start_date) + due_dates = Issue.where(project_id: projects).group(:project_id).maximum(:due_date) + projects.each do |project| + project.cached_start_date = start_dates[project.id] + project.cached_due_date = due_dates[project.id] + end ancestors = [] if options[:init_level] && projects.first ancestors = projects.first.ancestors.to_a