From eb427f00deab895fe58c114ca9b366ecc693ffe7 Mon Sep 17 00:00:00 2001 From: Daniel O'Connor Date: Sun, 20 Sep 2026 13:53:58 +0930 Subject: [PATCH] Optimize PaperTrail whodunnit query in CropsController#show (#4796) * Optimize PaperTrail whodunnit query in CropsController#show Replace @crop.versions.map(&:whodunnit) with @crop.versions.distinct.pluck(:whodunnit) to avoid instantiating all PaperTrail version objects and loading object/object_changes into memory. Co-authored-by: CloCkWeRX <365751+CloCkWeRX@users.noreply.github.com> * Optimize PaperTrail whodunnit query in CropsController#show Replace @crop.versions.map(&:whodunnit) with @crop.versions.distinct.pluck(:whodunnit) to avoid instantiating all PaperTrail version objects and loading object/object_changes into memory. Added unit test in spec/controllers/crops_controller_spec.rb. Co-authored-by: CloCkWeRX <365751+CloCkWeRX@users.noreply.github.com> * Optimize PaperTrail whodunnit query in CropsController#show Use @crop.versions.reorder(nil).distinct.pluck(:whodunnit) to avoid instantiating all PaperTrail version objects into memory and prevent PostgreSQL PG::InvalidColumnReference errors with SELECT DISTINCT. Co-authored-by: CloCkWeRX <365751+CloCkWeRX@users.noreply.github.com> * Fix crop route parameter in controller spec Update parameter key from id to slug in CropsController show spec to match param: :slug route definition. Co-authored-by: CloCkWeRX <365751+CloCkWeRX@users.noreply.github.com> --------- Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com> --- app/controllers/crops_controller.rb | 2 +- spec/controllers/crops_controller_spec.rb | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/app/controllers/crops_controller.rb b/app/controllers/crops_controller.rb index 0caac083b..7fbd6a876 100644 --- a/app/controllers/crops_controller.rb +++ b/app/controllers/crops_controller.rb @@ -73,7 +73,7 @@ class CropsController < ApplicationController format.html do @posts = @crop.posts.order(created_at: :desc).paginate(page: params[:page]) @companions = @crop.companions.approved - member_ids = @crop.versions.map(&:whodunnit).compact.map(&:to_i) + member_ids = @crop.versions.reorder(nil).distinct.pluck(:whodunnit).compact.map(&:to_i) @version_members = Member.where(id: member_ids).index_by(&:id) end format.svg do diff --git a/spec/controllers/crops_controller_spec.rb b/spec/controllers/crops_controller_spec.rb index 86dbf0988..7bac0558b 100644 --- a/spec/controllers/crops_controller_spec.rb +++ b/spec/controllers/crops_controller_spec.rb @@ -28,6 +28,27 @@ describe CropsController do end end + describe "GET show" do + let!(:crop) { create(:crop) } + let!(:member) { create(:member) } + + before do + PaperTrail::Version.create!( + item_type: 'Crop', + item_id: crop.id, + event: 'update', + whodunnit: member.id.to_s, + created_at: Time.current + ) + end + + it "fetches crop show page and sets version members using distinct whodunnit IDs" do + get :show, params: { slug: crop.to_param } + expect(response).to be_successful + expect(assigns(:version_members)).to eq({ member.id => member }) + end + end + describe "GET crop hierarchy" do describe 'fetches the crop hierarchy page' do context 'wrangler' do