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>
This commit is contained in:
authored and GitHub committed 2026-09-20 13:53:58 +09:30
1 parent a349ce784a
commit eb427f00de
2 files changed
+22 -1

No files matched your search

+1 -1
View File
@@ -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
+21
View File
@@ -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