diff --git a/app/models/issue.rb b/app/models/issue.rb index 0b8a2b2..4c01c48 100644 --- a/app/models/issue.rb +++ b/app/models/issue.rb @@ -244,6 +244,7 @@ class Issue < ActiveRecord::Base @spent_hours = nil @total_spent_hours = nil @total_estimated_hours = nil + @last_updated_by = nil base_reload(*args) end @@ -1027,6 +1028,10 @@ class Issue < ActiveRecord::Base @relations ||= IssueRelation::Relations.new(self, (relations_from + relations_to).sort) end + def last_updated_by + @last_updated_by + end + # Preloads relations for a collection of issues def self.load_relations(issues) if issues.any? @@ -1081,6 +1086,24 @@ class Issue < ActiveRecord::Base end end + # Preloads users who updated last a collection of issues + def self.load_last_updated_by(issues) + if issues.any? + journals_user = {} + issues_last_journal = Journal.joins(:issue).preload(:user). + where('issues.updated_on = journals.created_on'). + where(:journalized_id => issues.map(&:id)) + + issues_last_journal.each do |journal| + journals_user[journal.journalized_id] = journal.user + end + + issues.each do |issue| + issue.instance_variable_set "@last_updated_by", (journals_user[issue.id] || nil) + end + end + end + # Finds an issue relation given its id. def find_relation(relation_id) IssueRelation.where("issue_to_id = ? OR issue_from_id = ?", id, id).find(relation_id) @@ -1400,7 +1423,7 @@ class Issue < ActiveRecord::Base end Project.where(condition).having_trackers end - + # Returns a scope of trackers that user can assign the issue to def allowed_target_trackers(user=User.current) self.class.allowed_target_trackers(project, user, tracker_id_was) diff --git a/app/models/issue_query.rb b/app/models/issue_query.rb index f718e3e..ac7893b 100644 --- a/app/models/issue_query.rb +++ b/app/models/issue_query.rb @@ -31,6 +31,7 @@ class IssueQuery < Query QueryColumn.new(:author, :sortable => lambda {User.fields_for_order_statement("authors")}, :groupable => true), QueryColumn.new(:assigned_to, :sortable => lambda {User.fields_for_order_statement}, :groupable => true), QueryColumn.new(:updated_on, :sortable => "#{Issue.table_name}.updated_on", :default_order => 'desc'), + QueryColumn.new(:last_updated_by, :sortable => false), QueryColumn.new(:category, :sortable => "#{IssueCategory.table_name}.name", :groupable => true), QueryColumn.new(:fixed_version, :sortable => lambda {Version.fields_for_order_statement}, :groupable => true), QueryColumn.new(:start_date, :sortable => "#{Issue.table_name}.start_date"), @@ -44,7 +45,7 @@ class IssueQuery < Query QueryColumn.new(:created_on, :sortable => "#{Issue.table_name}.created_on", :default_order => 'desc'), QueryColumn.new(:closed_on, :sortable => "#{Issue.table_name}.closed_on", :default_order => 'desc'), QueryColumn.new(:relations, :caption => :label_related_issues), - QueryColumn.new(:description, :inline => false) + QueryColumn.new(:description, :inline => false), ] def initialize(attributes=nil, *args) @@ -328,6 +329,9 @@ class IssueQuery < Query if has_column?(:total_spent_hours) Issue.load_visible_total_spent_hours(issues) end + if has_column?(:last_updated_by) + Issue.load_last_updated_by(issues) + end if has_column?(:relations) Issue.load_visible_relations(issues) end