diff --git a/app/models/members/group_member.rb b/app/models/members/group_member.rb index 39b5627d626d6936c2651a0db87626023275e4fb..9a916cd40ae9cf483c51cbcbfa48fcd53c5ab95a 100644 --- a/app/models/members/group_member.rb +++ b/app/models/members/group_member.rb @@ -16,9 +16,16 @@ class GroupMember < Member default_scope { where(source_type: SOURCE_TYPE) } # rubocop:disable Cop/DefaultScope scope :of_groups, ->(groups) { where(source_id: groups.select(:id)) } - scope :count_users_by_group_id, -> { joins(:user).group(:source_id).count } scope :of_ldap_type, -> { where(ldap: true) } + scope :count_users_by_group_id, -> do + if Feature.enabled?(:optimized_count_users_by_group_id) + group(:source_id).count + else + joins(:user).group(:source_id).count + end + end + after_create :update_two_factor_requirement, unless: :invite? after_destroy :update_two_factor_requirement, unless: :invite? diff --git a/spec/models/members/group_member_spec.rb b/spec/models/members/group_member_spec.rb index 9b5cce1aebf437cde6d1cb77d627605e57733baa..fdb71b7ec7db32248b602502c702d9e5c909c465 100644 --- a/spec/models/members/group_member_spec.rb +++ b/spec/models/members/group_member_spec.rb @@ -4,7 +4,7 @@ describe GroupMember do context 'scopes' do - describe '.count_users_by_group_id' do + shared_examples '.count_users_by_group_id' do it 'counts users by group ID' do user_1 = create(:user) user_2 = create(:user) @@ -20,6 +20,36 @@ end end + describe '.count_users_by_group_id with optimized_count_users_by_group_id feature flag on' do + before do + stub_feature_flags(optimized_count_users_by_group_id: true) + end + + it_behaves_like '.count_users_by_group_id' + + it 'does not JOIN users' do + scope = described_class.all + expect(scope).not_to receive(:joins).with(:user) + + scope.count_users_by_group_id + end + end + + describe '.count_users_by_group_id with optimized_count_users_by_group_id feature flag off' do + before do + stub_feature_flags(optimized_count_users_by_group_id: false) + end + + it_behaves_like '.count_users_by_group_id' + + it 'does JOIN users' do + scope = described_class.all + expect(scope).to receive(:joins).with(:user).and_call_original + + scope.count_users_by_group_id + end + end + describe '.of_ldap_type' do it 'returns ldap type users' do group_member = create(:group_member, :ldap)