diff --git a/app/queries/dashboard_query.rb b/app/queries/dashboard_query.rb index a64cd030a..8c9f33537 100644 --- a/app/queries/dashboard_query.rb +++ b/app/queries/dashboard_query.rb @@ -3,10 +3,7 @@ class DashboardQuery MAX_WORKSHOP_QUERY = 10 def self.upcoming_events - workshops = Workshop.eager_load(:chapter, :sponsors, :organisers, :permissions, :workshop_host) - .today_and_upcoming - .limit(MAX_WORKSHOP_QUERY) - .to_a + workshops = upcoming_workshops sorted_events = all_events(workshops).sort_by(&:date_and_time) limited_events = [] @@ -57,4 +54,13 @@ def self.all_events(workshops) [*workshops, *events, meeting].uniq.compact end private_class_method :all_events + + def self.upcoming_workshops + Workshop.eager_load(:chapter, :sponsors, :organisers, :permissions) + .preload(workshop_host: :sponsor) + .today_and_upcoming + .limit(MAX_WORKSHOP_QUERY) + .to_a + end + private_class_method :upcoming_workshops end diff --git a/spec/queries/dashboard_query_spec.rb b/spec/queries/dashboard_query_spec.rb index 365164a0a..e86f2298e 100644 --- a/spec/queries/dashboard_query_spec.rb +++ b/spec/queries/dashboard_query_spec.rb @@ -16,6 +16,25 @@ expect(result.values.flatten).to include(workshop, event, meeting) end + it 'loads each workshop host when workshops have multiple sponsors and organisers' do + chapter = Fabricate(:chapter) + additional_sponsor = Fabricate(:sponsor) + host = Fabricate(:sponsor) + organisers = Fabricate.times(2, :member) + workshops = Fabricate.times(16, :workshop_no_sponsor, chapter:) + + workshops.each do |workshop| + Fabricate(:workshop_sponsor, workshop:, sponsor: additional_sponsor) + Fabricate(:workshop_sponsor, workshop:, sponsor: host, host: true) + organisers.each { |organiser| organiser.add_role(:organiser, workshop) } + end + + result = described_class.upcoming_events + + expect(result.values.flatten.select { |event| event.is_a?(Workshop) }.map(&:host)) + .to all(eq(host)) + end + it 'limits to exactly 3 distinct dates' do Fabricate(:workshop, date_and_time: 1.day.from_now) Fabricate(:workshop, date_and_time: 2.days.from_now)