diff --git a/app/models/chapter.rb b/app/models/chapter.rb index ae0f9d9bd..9aad80091 100644 --- a/app/models/chapter.rb +++ b/app/models/chapter.rb @@ -36,20 +36,22 @@ def organisers @organisers ||= Member.with_role(:organiser, self) end + def students - Member.joins(:groups) - .merge(Group.students) - .distinct + members_for_group('Students') end def coaches - Member.joins(:groups) - .merge(Group.coaches) - .distinct + members_for_group('Coaches') end + private + def members_for_group(name) + members.where(groups: { name: name }).distinct + end + def expire_chapters_sidebar_cache Rails.cache.delete('chapters-sidebar') end diff --git a/spec/models/chapter_spec.rb b/spec/models/chapter_spec.rb index 575685425..a540ff71e 100644 --- a/spec/models/chapter_spec.rb +++ b/spec/models/chapter_spec.rb @@ -65,4 +65,34 @@ expect(Rails.cache.read(cache_key)).to be_nil end end + + describe "helper methods return only that chapter's coaches/students" do + RSpec.shared_examples 'group-scoped members' do |group_name, method_name| + let(:this_chapter) { Fabricate(:chapter) } + let(:that_chapter) { Fabricate(:chapter) } + + let!(:this_group) { Fabricate(:group, chapter: this_chapter, name: group_name) } + let!(:that_group) { Fabricate(:group, chapter: that_chapter, name: group_name) } + + let!(:this_member) { Fabricate(:member) } + let!(:that_member) { Fabricate(:member) } + + before do + Fabricate(:subscription, group: this_group, member: this_member) + Fabricate(:subscription, group: that_group, member: that_member) + end + + it "returns only #{group_name.downcase} for the chapter" do + expect(this_chapter.public_send(method_name)) + .to contain_exactly(this_member) + end + + it "does not include #{group_name.downcase} from another chapter" do + expect(this_chapter.public_send(method_name)) + .not_to include(that_member) + end + end + it_behaves_like 'group-scoped members', 'Students', :students + it_behaves_like 'group-scoped members', 'Coaches', :coaches + end end