From 7df6ae646066dc9a7bbe1d6785ae85a1f5585b8f Mon Sep 17 00:00:00 2001 From: "jonathan.kerr" <3410350+jonodrew@users.noreply.github.com> Date: Sat, 23 Aug 2025 21:36:06 +0100 Subject: [PATCH 01/14] Generate the ids for the workshops a member is attending in one go This removes a call to '#attending?' for every workshop, instead creating a single method to generate the list. Running locally with a small sample, it reduced loading time for the homepage by 70% Signed-off-by: jonathan.kerr <3410350+jonodrew@users.noreply.github.com> --- app/controllers/dashboard_controller.rb | 8 ++++++-- app/views/dashboard/show.html.haml | 2 +- app/views/events/_event.html.haml | 5 +++-- app/views/workshops/_workshop.html.haml | 2 +- 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/app/controllers/dashboard_controller.rb b/app/controllers/dashboard_controller.rb index 770aec86b..7b6ff9df9 100644 --- a/app/controllers/dashboard_controller.rb +++ b/app/controllers/dashboard_controller.rb @@ -4,7 +4,7 @@ class DashboardController < ApplicationController DEFAULT_UPCOMING_EVENTS = 5 - helper_method :year_param + helper_method :year_param, :attending_workshops def show @chapters = Chapter.active.all.order(:created_at) @@ -13,7 +13,7 @@ def show hash[key] = EventPresenter.decorate_collection(value) hash end - + @attending_ids = attending_workshops @testimonials = Testimonial.order(Arel.sql('RANDOM()')).limit(5).includes(:member) end @@ -84,4 +84,8 @@ def all_events(workshops) [*workshops, *events, meeting].uniq.compact end + + def attending_workshops + current_user.nil? ? Set.new : current_user.workshop_invitations.accepted.pluck(:id).to_set + end end diff --git a/app/views/dashboard/show.html.haml b/app/views/dashboard/show.html.haml index c161757ea..8fffaccac 100644 --- a/app/views/dashboard/show.html.haml +++ b/app/views/dashboard/show.html.haml @@ -71,7 +71,7 @@ %h2.h3.mb-4= t('homepage.events.upcoming') - @upcoming_workshops.each do |date, workshops| %h3.h5= date - = render workshops + = render workshops, attending_ids: @attending_ids .col-lg-4.pl-lg-5 %h3 diff --git a/app/views/events/_event.html.haml b/app/views/events/_event.html.haml index d36a297aa..5df7529d5 100644 --- a/app/views/events/_event.html.haml +++ b/app/views/events/_event.html.haml @@ -5,10 +5,11 @@ - if event.chapter %span.badge.bg-primary.mb-3.mb-md-0 = link_to event.chapter.name, event.chapter.slug, class: 'text-light text-decoration-none' - - if @user - - if @user.attending?(event.__getobj__) + - if !attending_ids.blank? + - if attending_ids.include?(event.id) %span.badge.bg-success.mb-3.mb-md-0 = link_to 'Attending', event.path, class: 'text-light text-decoration-none' + - if @user - if @user.event_organiser?(event) %span.badge.bg-secondary.mb-3.mb-md-0 = link_to 'Manage', event.admin_path, class: 'text-light text-decoration-none' diff --git a/app/views/workshops/_workshop.html.haml b/app/views/workshops/_workshop.html.haml index b8cbe5e71..e013f1059 100644 --- a/app/views/workshops/_workshop.html.haml +++ b/app/views/workshops/_workshop.html.haml @@ -1 +1 @@ -= render partial: 'events/event', locals: { event: workshop } += render partial: 'events/event', locals: { event: workshop, attending_ids: attending_ids } From c32fef6fafe73945ec413b505aefb8d2f472b466 Mon Sep 17 00:00:00 2001 From: "jonathan.kerr" <3410350+jonodrew@users.noreply.github.com> Date: Sun, 24 Aug 2025 10:58:35 +0100 Subject: [PATCH 02/14] Wrap `MemberPresenter#attending_workshops` safely This now checks if the object passed to the Presenter is `nil` and responds accordingly. I've updated the logic in the dashboard_controller.rb to reflect the change Signed-off-by: jonathan.kerr <3410350+jonodrew@users.noreply.github.com> --- app/controllers/dashboard_controller.rb | 10 +++------- app/presenters/member_presenter.rb | 9 +++++++++ 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/app/controllers/dashboard_controller.rb b/app/controllers/dashboard_controller.rb index 7b6ff9df9..4bd1f79ad 100644 --- a/app/controllers/dashboard_controller.rb +++ b/app/controllers/dashboard_controller.rb @@ -4,16 +4,16 @@ class DashboardController < ApplicationController DEFAULT_UPCOMING_EVENTS = 5 - helper_method :year_param, :attending_workshops + helper_method :year_param def show @chapters = Chapter.active.all.order(:created_at) - @user = current_user ? MemberPresenter.new(current_user) : nil + @user = MemberPresenter.new(current_user) @upcoming_workshops = upcoming_events.map.inject({}) do |hash, (key, value)| hash[key] = EventPresenter.decorate_collection(value) hash end - @attending_ids = attending_workshops + @attending_ids = @user.attending_workshops @testimonials = Testimonial.order(Arel.sql('RANDOM()')).limit(5).includes(:member) end @@ -84,8 +84,4 @@ def all_events(workshops) [*workshops, *events, meeting].uniq.compact end - - def attending_workshops - current_user.nil? ? Set.new : current_user.workshop_invitations.accepted.pluck(:id).to_set - end end diff --git a/app/presenters/member_presenter.rb b/app/presenters/member_presenter.rb index 388415202..75262260b 100644 --- a/app/presenters/member_presenter.rb +++ b/app/presenters/member_presenter.rb @@ -1,4 +1,9 @@ class MemberPresenter < BasePresenter + + def initialize(current_user) + @member = current_user + super + end def organiser? has_role? :organiser, :any end @@ -23,6 +28,10 @@ def pairing_details_array(role, tutorial, note) role.eql?('Coach') ? coach_pairing_details(note) : student_pairing_details(tutorial, note) end + def attending_workshops + @member.nil? ? Set.new : workshop_invitations.accepted.pluck(:id).to_set + end + private def coach_pairing_details(note) From 4ae22773e7e4af030481ece818dcfcc9e2e8586e Mon Sep 17 00:00:00 2001 From: "jonathan.kerr" <3410350+jonodrew@users.noreply.github.com> Date: Sun, 24 Aug 2025 11:00:47 +0100 Subject: [PATCH 03/14] Add the method call to the ChapterController There feels like a lot of repetition here, but I can't figure out how to remove it right now Signed-off-by: jonathan.kerr <3410350+jonodrew@users.noreply.github.com> --- app/controllers/chapter_controller.rb | 1 + app/views/chapter/show.html.haml | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/controllers/chapter_controller.rb b/app/controllers/chapter_controller.rb index 35c200307..2cb0d86be 100644 --- a/app/controllers/chapter_controller.rb +++ b/app/controllers/chapter_controller.rb @@ -10,6 +10,7 @@ def show @latest_workshops = event_presenters_by_date(past_events) @recent_sponsors = Sponsor.recent_for_chapter(@chapter) + @attending_ids = MemberPresenter.new(current_user).attending_workshops end private diff --git a/app/views/chapter/show.html.haml b/app/views/chapter/show.html.haml index a61fbd6fb..99cbad5dd 100644 --- a/app/views/chapter/show.html.haml +++ b/app/views/chapter/show.html.haml @@ -28,13 +28,13 @@ %h2.mb-4= t('homepage.events.upcoming') - @upcoming_workshops.each do |date, workshops| %h3.h5= date - = render workshops + = render workshops, attending_ids: @attending_ids - if @latest_workshops.any? .pt-4 %h2.mb-4 Past Events - @latest_workshops.each do |date, workshops| - = render workshops + = render workshops, attending_ids: @attending_ids - if @recent_sponsors.any? .py-4.py-lg-5.bg-light From ddc4ecfc1559f670ea6037b2ce87ce477d85f08a Mon Sep 17 00:00:00 2001 From: "jonathan.kerr" <3410350+jonodrew@users.noreply.github.com> Date: Sun, 24 Aug 2025 11:15:58 +0100 Subject: [PATCH 04/14] Have MemberPresenter return false to undefined methods In order to use the MemberPresenter more flexibly, I want to remove the constant checking. The Presenter should be able to intialise with a `nil` object and then deal with the consequences of that. This approach will return `false` to any method not defined on the presenter or the presented object. Signed-off-by: jonathan.kerr <3410350+jonodrew@users.noreply.github.com> --- app/presenters/member_presenter.rb | 1 + app/services/false_responder.rb | 11 +++++++++++ 2 files changed, 12 insertions(+) create mode 100644 app/services/false_responder.rb diff --git a/app/presenters/member_presenter.rb b/app/presenters/member_presenter.rb index 75262260b..09830ed4e 100644 --- a/app/presenters/member_presenter.rb +++ b/app/presenters/member_presenter.rb @@ -1,4 +1,5 @@ class MemberPresenter < BasePresenter + include FalseResponder def initialize(current_user) @member = current_user diff --git a/app/services/false_responder.rb b/app/services/false_responder.rb new file mode 100644 index 000000000..501c11f7d --- /dev/null +++ b/app/services/false_responder.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +module FalseResponder + def method_missing(method_name, *args, &block) + false + end + + def respond_to_missing?(method_name, include_private = false) + true + end +end From e98a783c41652c71c994dc29091d66e54515eb3a Mon Sep 17 00:00:00 2001 From: "jonathan.kerr" <3410350+jonodrew@users.noreply.github.com> Date: Sun, 24 Aug 2025 11:23:05 +0100 Subject: [PATCH 05/14] Update dashboard controller again Current count: 16 failures. Signed-off-by: jonathan.kerr <3410350+jonodrew@users.noreply.github.com> --- app/controllers/dashboard_controller.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/controllers/dashboard_controller.rb b/app/controllers/dashboard_controller.rb index 4bd1f79ad..37f11a518 100644 --- a/app/controllers/dashboard_controller.rb +++ b/app/controllers/dashboard_controller.rb @@ -24,6 +24,7 @@ def dashboard hash end @announcements = current_user.announcements.active + @attending_ids = MemberPresenter.new(current_user).attending_workshops end def code; end From 7b26aa277d6341fc6ec02d1b20df7ca973675e90 Mon Sep 17 00:00:00 2001 From: "jonathan.kerr" <3410350+jonodrew@users.noreply.github.com> Date: Sun, 24 Aug 2025 11:33:42 +0100 Subject: [PATCH 06/14] Revert "Have MemberPresenter return false to undefined methods" This reverts commit f909f8beb19bb1733ce60fcf6ff0d38e032559a8. --- app/presenters/member_presenter.rb | 1 - app/services/false_responder.rb | 11 ----------- 2 files changed, 12 deletions(-) delete mode 100644 app/services/false_responder.rb diff --git a/app/presenters/member_presenter.rb b/app/presenters/member_presenter.rb index 09830ed4e..75262260b 100644 --- a/app/presenters/member_presenter.rb +++ b/app/presenters/member_presenter.rb @@ -1,5 +1,4 @@ class MemberPresenter < BasePresenter - include FalseResponder def initialize(current_user) @member = current_user diff --git a/app/services/false_responder.rb b/app/services/false_responder.rb deleted file mode 100644 index 501c11f7d..000000000 --- a/app/services/false_responder.rb +++ /dev/null @@ -1,11 +0,0 @@ -# frozen_string_literal: true - -module FalseResponder - def method_missing(method_name, *args, &block) - false - end - - def respond_to_missing?(method_name, include_private = false) - true - end -end From eb6e86791e25b99c3b5a307ec71c824f08df51d3 Mon Sep 17 00:00:00 2001 From: "jonathan.kerr" <3410350+jonodrew@users.noreply.github.com> Date: Sun, 24 Aug 2025 11:46:06 +0100 Subject: [PATCH 07/14] Add method for getting event attendances Apply the method across the events area, in the same way we did for workshops Signed-off-by: jonathan.kerr <3410350+jonodrew@users.noreply.github.com> --- app/controllers/events_controller.rb | 1 + app/presenters/member_presenter.rb | 4 ++++ app/views/events/_events.html.haml | 2 +- app/views/events/index.html.haml | 4 ++-- 4 files changed, 8 insertions(+), 3 deletions(-) diff --git a/app/controllers/events_controller.rb b/app/controllers/events_controller.rb index 1736eb6ca..4f99c3ef3 100644 --- a/app/controllers/events_controller.rb +++ b/app/controllers/events_controller.rb @@ -23,6 +23,7 @@ def index events << Event.upcoming.includes(:venue, :sponsors).all events = events.compact.flatten.sort_by(&:date_and_time).group_by(&:date) @events = events.map.inject({}) { |hash, (key, value)| hash[key] = EventPresenter.decorate_collection(value); hash } + @attending_ids = MemberPresenter.new(current_user).attending_events end def show diff --git a/app/presenters/member_presenter.rb b/app/presenters/member_presenter.rb index 75262260b..ac616fe7a 100644 --- a/app/presenters/member_presenter.rb +++ b/app/presenters/member_presenter.rb @@ -32,6 +32,10 @@ def attending_workshops @member.nil? ? Set.new : workshop_invitations.accepted.pluck(:id).to_set end + def attending_events + @member.nil? ? Set.new : invitations.accepted.pluck(:id).to_set + end + private def coach_pairing_details(note) diff --git a/app/views/events/_events.html.haml b/app/views/events/_events.html.haml index 95a9a1dd0..f2c4a0520 100644 --- a/app/views/events/_events.html.haml +++ b/app/views/events/_events.html.haml @@ -4,4 +4,4 @@ %h3.h5= date .row .col-md-8 - = render workshops + = render workshops, attending_ids: attending_ids diff --git a/app/views/events/index.html.haml b/app/views/events/index.html.haml index fd5908a8d..86aa0e085 100644 --- a/app/views/events/index.html.haml +++ b/app/views/events/index.html.haml @@ -5,11 +5,11 @@ .col - if @events.any? %h3.mb-4 Upcoming Events - = render partial: 'events', locals: { grouped_events: @events } + = render partial: 'events', locals: { grouped_events: @events, attending_ids: @attending_ids} .container{'data-test': 'past-events'} .row .col - if @past_events.any? %h3.mb-4 Past Events - = render partial: 'events', locals: { grouped_events: @past_events } + = render partial: 'events', locals: { grouped_events: @past_events, attending_ids: @attending_ids } From bbdda6a4527c0a9267fa726113702015a099b8d1 Mon Sep 17 00:00:00 2001 From: "jonathan.kerr" <3410350+jonodrew@users.noreply.github.com> Date: Sun, 24 Aug 2025 12:12:03 +0100 Subject: [PATCH 08/14] Move methods to AttendanceConcerns and refactor Signed-off-by: jonathan.kerr <3410350+jonodrew@users.noreply.github.com> --- app/controllers/chapter_controller.rb | 3 ++- app/controllers/concerns/attendance_concerns.rb | 13 +++++++++++++ app/controllers/dashboard_controller.rb | 7 ++++--- app/controllers/events_controller.rb | 3 ++- app/presenters/member_presenter.rb | 10 ---------- 5 files changed, 21 insertions(+), 15 deletions(-) create mode 100644 app/controllers/concerns/attendance_concerns.rb diff --git a/app/controllers/chapter_controller.rb b/app/controllers/chapter_controller.rb index 2cb0d86be..4bbe76e14 100644 --- a/app/controllers/chapter_controller.rb +++ b/app/controllers/chapter_controller.rb @@ -1,4 +1,5 @@ class ChapterController < ApplicationController + include AttendanceConcerns def show @chapter = ChapterPresenter.new(Chapter.active.find_by!(slug: slug)) @@ -10,7 +11,7 @@ def show @latest_workshops = event_presenters_by_date(past_events) @recent_sponsors = Sponsor.recent_for_chapter(@chapter) - @attending_ids = MemberPresenter.new(current_user).attending_workshops + @attending_ids = attending_workshops end private diff --git a/app/controllers/concerns/attendance_concerns.rb b/app/controllers/concerns/attendance_concerns.rb new file mode 100644 index 000000000..b8c2b66b8 --- /dev/null +++ b/app/controllers/concerns/attendance_concerns.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +module AttendanceConcerns + extend ActiveSupport::Concern + + def attending_workshops + current_user.nil? ? Set.new : current_user.workshop_invitations.accepted.pluck(:id).to_set + end + + def attending_events + current_user.nil? ? Set.new : current_user.invitations.accepted.pluck(:id).to_set + end +end diff --git a/app/controllers/dashboard_controller.rb b/app/controllers/dashboard_controller.rb index 37f11a518..0682ff84f 100644 --- a/app/controllers/dashboard_controller.rb +++ b/app/controllers/dashboard_controller.rb @@ -1,4 +1,5 @@ class DashboardController < ApplicationController + include AttendanceConcerns before_action :is_logged_in?, only: %i[dashboard] skip_before_action :accept_terms, except: %i[dashboard show] @@ -8,12 +9,12 @@ class DashboardController < ApplicationController def show @chapters = Chapter.active.all.order(:created_at) - @user = MemberPresenter.new(current_user) + @user = current_user ? MemberPresenter.new(current_user) : nil @upcoming_workshops = upcoming_events.map.inject({}) do |hash, (key, value)| hash[key] = EventPresenter.decorate_collection(value) hash end - @attending_ids = @user.attending_workshops + @attending_ids = attending_workshops @testimonials = Testimonial.order(Arel.sql('RANDOM()')).limit(5).includes(:member) end @@ -24,7 +25,7 @@ def dashboard hash end @announcements = current_user.announcements.active - @attending_ids = MemberPresenter.new(current_user).attending_workshops + @attending_ids = attending_workshops end def code; end diff --git a/app/controllers/events_controller.rb b/app/controllers/events_controller.rb index 4f99c3ef3..3c983ce47 100644 --- a/app/controllers/events_controller.rb +++ b/app/controllers/events_controller.rb @@ -1,6 +1,7 @@ require 'services/ticket' class EventsController < ApplicationController + include AttendanceConcerns before_action :is_logged_in?, only: %i[student coach] RECENT_EVENTS_DISPLAY_LIMIT = 40 @@ -23,7 +24,7 @@ def index events << Event.upcoming.includes(:venue, :sponsors).all events = events.compact.flatten.sort_by(&:date_and_time).group_by(&:date) @events = events.map.inject({}) { |hash, (key, value)| hash[key] = EventPresenter.decorate_collection(value); hash } - @attending_ids = MemberPresenter.new(current_user).attending_events + @attending_ids = attending_events end def show diff --git a/app/presenters/member_presenter.rb b/app/presenters/member_presenter.rb index ac616fe7a..01db0b942 100644 --- a/app/presenters/member_presenter.rb +++ b/app/presenters/member_presenter.rb @@ -1,9 +1,5 @@ class MemberPresenter < BasePresenter - def initialize(current_user) - @member = current_user - super - end def organiser? has_role? :organiser, :any end @@ -28,13 +24,7 @@ def pairing_details_array(role, tutorial, note) role.eql?('Coach') ? coach_pairing_details(note) : student_pairing_details(tutorial, note) end - def attending_workshops - @member.nil? ? Set.new : workshop_invitations.accepted.pluck(:id).to_set - end - def attending_events - @member.nil? ? Set.new : invitations.accepted.pluck(:id).to_set - end private From e5f338b55cb0d1b45a0db39f41ba004d5364ad18 Mon Sep 17 00:00:00 2001 From: "jonathan.kerr" <3410350+jonodrew@users.noreply.github.com> Date: Sun, 24 Aug 2025 12:30:52 +0100 Subject: [PATCH 09/14] Add events attending to the dashboard haml Signed-off-by: jonathan.kerr <3410350+jonodrew@users.noreply.github.com> --- app/views/dashboard/dashboard.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/dashboard/dashboard.html.haml b/app/views/dashboard/dashboard.html.haml index 89d766e17..5e2e11c18 100644 --- a/app/views/dashboard/dashboard.html.haml +++ b/app/views/dashboard/dashboard.html.haml @@ -32,4 +32,4 @@ There are no upcoming events announced for the chapters you are subscribed to. - @ordered_events.each do |date, workshops| %h4= date - = render workshops + = render workshops, attending_ids: @attending_ids From 3ec5adeb40a2322a0f59378115f882c80f28e92a Mon Sep 17 00:00:00 2001 From: "jonathan.kerr" <3410350+jonodrew@users.noreply.github.com> Date: Sun, 24 Aug 2025 14:53:36 +0100 Subject: [PATCH 10/14] Rework `event_organiser` method to be less DB-heavy Currently we call `event_organiser` on every event when creating the dashboard. I've rewritten it to cache some of the things a user might be an organiser of. Signed-off-by: jonathan.kerr <3410350+jonodrew@users.noreply.github.com> --- app/presenters/member_presenter.rb | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/app/presenters/member_presenter.rb b/app/presenters/member_presenter.rb index 01db0b942..d34d3e908 100644 --- a/app/presenters/member_presenter.rb +++ b/app/presenters/member_presenter.rb @@ -4,8 +4,19 @@ def organiser? has_role? :organiser, :any end + # Gather all the ids of all the events the member has organised or has organising permissions for + def organising_events + @organised_events ||= roles.preload(:resource).where(name: 'organiser').pluck(:resource_type, :resource_id).group_by(&:first).transform_values { |pairs | pairs.map(&:last)} + end + def event_organiser?(event) - has_role?(:organiser, event) || has_role?(:organiser, event.chapter) || has_role?(:admin) + if model.nil? + false + else + event_types = %w[Workshop Meeting Event] + organising_events.slice(*event_types).values.any? { |ids| ids.include?(event.id) } || @organised_events['Chapter']&.include?(event.chapter.id) || has_role?(:admin) + end + end def newbie? From 6976f0cdf8ef1107fe38d011672cbbd728d43035 Mon Sep 17 00:00:00 2001 From: "jonathan.kerr" <3410350+jonodrew@users.noreply.github.com> Date: Sun, 24 Aug 2025 14:54:13 +0100 Subject: [PATCH 11/14] Cache admin status We don't need to check if a user is admin every single time, so I've cached the check Signed-off-by: jonathan.kerr <3410350+jonodrew@users.noreply.github.com> --- app/presenters/member_presenter.rb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/presenters/member_presenter.rb b/app/presenters/member_presenter.rb index d34d3e908..c64cf9acf 100644 --- a/app/presenters/member_presenter.rb +++ b/app/presenters/member_presenter.rb @@ -4,6 +4,10 @@ def organiser? has_role? :organiser, :any end + def is_admin? + @admin ||= has_role?(:admin) + end + # Gather all the ids of all the events the member has organised or has organising permissions for def organising_events @organised_events ||= roles.preload(:resource).where(name: 'organiser').pluck(:resource_type, :resource_id).group_by(&:first).transform_values { |pairs | pairs.map(&:last)} @@ -14,7 +18,7 @@ def event_organiser?(event) false else event_types = %w[Workshop Meeting Event] - organising_events.slice(*event_types).values.any? { |ids| ids.include?(event.id) } || @organised_events['Chapter']&.include?(event.chapter.id) || has_role?(:admin) + organising_events.slice(*event_types).values.any? { |ids| ids.include?(event.id) } || @organised_events['Chapter']&.include?(event.chapter.id) || is_admin? end end From 623829e579bcc4a7b6d7c0c9786978bfe62c3e0d Mon Sep 17 00:00:00 2001 From: "jonathan.kerr" <3410350+jonodrew@users.noreply.github.com> Date: Sun, 24 Aug 2025 15:23:09 +0100 Subject: [PATCH 12/14] Load all chapters once We don't need to load each chapter separately - let's get them all in one! Signed-off-by: jonathan.kerr <3410350+jonodrew@users.noreply.github.com> --- app/views/dashboard/dashboard.html.haml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/views/dashboard/dashboard.html.haml b/app/views/dashboard/dashboard.html.haml index 5e2e11c18..1f669e39c 100644 --- a/app/views/dashboard/dashboard.html.haml +++ b/app/views/dashboard/dashboard.html.haml @@ -16,7 +16,8 @@ %small= link_to 'Edit', subscriptions_path, class: 'ms-2' - if current_user.chapters.any? .list-group.list-group-flush - - current_user.chapters.each do |chapter| + - chapters = current_user.chapters + - chapters.each do |chapter| = link_to chapter.name, chapter_url(chapter.slug), class: 'list-group-item list-group-item-action' - else %i.fas.fa-exclamation-triangle From eb830baecc21e65784354a5890b9bb8723857699 Mon Sep 17 00:00:00 2001 From: "jonathan.kerr" <3410350+jonodrew@users.noreply.github.com> Date: Sun, 24 Aug 2025 15:28:48 +0100 Subject: [PATCH 13/14] Load all groups at once Signed-off-by: jonathan.kerr <3410350+jonodrew@users.noreply.github.com> --- app/views/admin/members/_profile.html.haml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/views/admin/members/_profile.html.haml b/app/views/admin/members/_profile.html.haml index bd4e7f583..6dd89a600 100644 --- a/app/views/admin/members/_profile.html.haml +++ b/app/views/admin/members/_profile.html.haml @@ -37,7 +37,8 @@ - if @member.groups.any? %h5 Groups %ul.list-unstyled.ms-0#subscriptions - - @member.groups.each do |group| + - member_groups = @member.groups + - member_groups.each do |group| %li = link_to [:admin, group] do #{group.name} (#{group.chapter.name}) From 0a0023430d8a5bd6a610c26e35901f9cfa32b652 Mon Sep 17 00:00:00 2001 From: "jonathan.kerr" <3410350+jonodrew@users.noreply.github.com> Date: Sun, 24 Aug 2025 15:33:51 +0100 Subject: [PATCH 14/14] Load sponsors and organisers once Signed-off-by: jonathan.kerr <3410350+jonodrew@users.noreply.github.com> --- app/views/events/_event.html.haml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/views/events/_event.html.haml b/app/views/events/_event.html.haml index 5df7529d5..a80724684 100644 --- a/app/views/events/_event.html.haml +++ b/app/views/events/_event.html.haml @@ -32,10 +32,12 @@ .d-md-flex.justify-content-md-between.align-items-md-center - if event.organisers.any? .mb-3.mb-md-0 - - event.organisers.each do |organiser| + - organisers = event.organisers + - organisers.each do |organiser| = image_tag(organiser.avatar(26), class: 'rounded-circle', title: organiser.full_name, alt: organiser.full_name) - if event.sponsors.any? .ms-auto - - event.sponsors.each do |sponsor| + - sponsors = event.sponsors + - sponsors.each do |sponsor| = link_to sponsor.website, class: 'd-inline-block' do = image_tag(sponsor.avatar.thumb.url, class: 'sponsor-sm mx-1', alt: sponsor.name)