Skip to content

Commit 4c5842a

Browse files
committed
model: add members_by_recent_rsvp method to Group
Adds a class method that returns group members sorted by their most recent workshop RSVP (most recent first, members with no RSVP at end). Includes test coverage for the new method.
1 parent 411338a commit 4c5842a

2 files changed

Lines changed: 31 additions & 0 deletions

File tree

app/models/group.rb

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,15 @@ class Group < ApplicationRecord
1111
scope :students, -> { where(name: 'Students') }
1212
scope :coaches, -> { where(name: 'Coaches') }
1313

14+
def self.members_by_recent_rsvp(group)
15+
group.members
16+
.joins('LEFT JOIN workshop_invitations ON workshop_invitations.member_id = members.id')
17+
.joins('LEFT JOIN workshops ON workshops.id = workshop_invitations.workshop_id')
18+
.select('members.*, MAX(workshops.date_and_time) as last_rsvp_at')
19+
.group('members.id')
20+
.order('MAX(workshops.date_and_time) DESC NULLS LAST')
21+
end
22+
1423
validates :name, presence: true, inclusion: { in: NAMES, message: 'Invalid name for Group' }
1524

1625
alias city chapter

spec/models/group_spec.rb

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,26 @@
2727
expect(group.eligible_members).to be_empty
2828
end
2929
end
30+
31+
describe '.members_by_recent_rsvp' do
32+
let(:group) { Fabricate(:group, name: 'Students') }
33+
let(:chapter) { group.chapter }
34+
35+
it 'orders members by most recent workshop RSVP' do
36+
old_workshop = Fabricate(:workshop, chapter: chapter, date_and_time: 1.month.ago)
37+
new_workshop = Fabricate(:workshop, chapter: chapter, date_and_time: 1.week.ago)
38+
39+
member_old = Fabricate(:member, groups: [group])
40+
member_new = Fabricate(:member, groups: [group])
41+
_member_no_rsvp = Fabricate(:member, groups: [group])
42+
43+
Fabricate(:workshop_invitation, workshop: old_workshop, member: member_old, attending: true)
44+
Fabricate(:workshop_invitation, workshop: new_workshop, member: member_new, attending: true)
45+
46+
results = Group.members_by_recent_rsvp(group).to_a
47+
48+
expect(results.first).to eq(member_new)
49+
expect(results.last).to eq(_member_no_rsvp)
50+
end
51+
end
3052
end

0 commit comments

Comments
 (0)