From fe223acfc75dd1533b6ab88e33391b8f24acd863 Mon Sep 17 00:00:00 2001 From: MAEDA Go Date: Thu, 21 May 2026 09:18:55 +0900 Subject: [PATCH 1/2] Cache builtin group instances per request to avoid repeated GroupAnonymous and GroupNonMember queries during permission checks --- app/models/group_builtin.rb | 7 ++++++- test/unit/group_test.rb | 11 +++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/app/models/group_builtin.rb b/app/models/group_builtin.rb index ced61a139..8154349f5 100644 --- a/app/models/group_builtin.rb +++ b/app/models/group_builtin.rb @@ -18,6 +18,10 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. class GroupBuiltin < Group + class Current < ActiveSupport::CurrentAttributes + attribute :instances + end + validate :validate_uniqueness, :on => :create def validate_uniqueness @@ -40,7 +44,8 @@ class GroupBuiltin < Group def load_instance return nil if self == GroupBuiltin - instance = unscoped.order(:id).first || create_instance + Current.instances ||= {} + Current.instances[self] ||= unscoped.order(:id).first || create_instance end def create_instance diff --git a/test/unit/group_test.rb b/test/unit/group_test.rb index 1fd836ca3..13a283b09 100644 --- a/test/unit/group_test.rb +++ b/test/unit/group_test.rb @@ -18,9 +18,11 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. require_relative '../test_helper' +require 'active_record/testing/query_assertions' class GroupTest < ActiveSupport::TestCase include Redmine::I18n + include ActiveRecord::Assertions::QueryAssertions def setup User.current = nil @@ -150,6 +152,15 @@ class GroupTest < ActiveSupport::TestCase end end + def test_builtin_groups_should_be_cached_until_current_attributes_reset + assert_queries_count(1) { Group.anonymous } + assert_no_queries { Group.anonymous } + + GroupBuiltin::Current.reset + + assert_queries_count(1) { Group.anonymous } + end + def test_builtin_in_group_should_be_uniq group = GroupAnonymous.new group.name = 'Foo' -- 2.55.0