mirror of
https://github.com/meineerde/redmine.git
synced 2026-01-31 11:37:14 +00:00
Optimize TimeEntryActivity#default_activity_id method by introducing early returns to reduce SQL queries (#42150).
Patch by Go MAEDA (user:maeda). git-svn-id: https://svn.redmine.org/redmine/trunk@23477 e93f8b46-1217-0410-a6f0-8f06a7374b81
This commit is contained in:
parent
c1560c7832
commit
7aacf5718c
@ -58,36 +58,36 @@ class TimeEntryActivity < Enumeration
|
||||
end
|
||||
|
||||
def self.default_activity_id(user=nil, project=nil)
|
||||
default_activities = []
|
||||
default_activity = nil
|
||||
available_activities = self.available_activities(project)
|
||||
return nil if available_activities.empty?
|
||||
return available_activities.first.id if available_activities.one?
|
||||
|
||||
find_matching_activity = ->(ids) do
|
||||
ids.each do |id|
|
||||
activity = available_activities.detect { |a| a.id == id || a.parent_id == id }
|
||||
return activity.id if activity
|
||||
end
|
||||
nil
|
||||
end
|
||||
|
||||
if project && user
|
||||
user_membership = user.membership(project)
|
||||
if user_membership
|
||||
default_activities = user_membership.roles.where.not(:default_time_entry_activity_id => nil).sort.pluck(:default_time_entry_activity_id)
|
||||
if (user_membership = user.membership(project))
|
||||
activity_ids = user_membership.roles.where.not(:default_time_entry_activity_id => nil).sort.pluck(:default_time_entry_activity_id)
|
||||
aid = find_matching_activity.call(activity_ids)
|
||||
return aid if aid
|
||||
end
|
||||
|
||||
project_default_activity = self.default(project)
|
||||
if project_default_activity && !default_activities.include?(project_default_activity.id)
|
||||
default_activities << project_default_activity.id
|
||||
if (project_default_activity = self.default(project))
|
||||
aid = find_matching_activity.call([project_default_activity.id])
|
||||
return aid if aid
|
||||
end
|
||||
end
|
||||
|
||||
global_activity = self.default
|
||||
if global_activity && !default_activities.include?(global_activity.id)
|
||||
default_activities << global_activity.id
|
||||
if (global_activity = self.default)
|
||||
aid = find_matching_activity.call([global_activity.id])
|
||||
return aid if aid
|
||||
end
|
||||
|
||||
if available_activities.count == 1 && !default_activities.include?(available_activities.first.id)
|
||||
default_activities << available_activities.first.id
|
||||
end
|
||||
|
||||
default_activities.each do |id|
|
||||
default_activity = available_activities.detect{ |a| a.id == id || a.parent_id == id }
|
||||
break unless default_activity.nil?
|
||||
end
|
||||
|
||||
default_activity&.id
|
||||
nil
|
||||
end
|
||||
end
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user