Improve read performance with caching and memoization (#4572)

* Improve read performance with caching and memoization

- Memoize `Crop#all_companions` and `Member#unread_count` in models
- Implement instance-level memoization in `CropsHelper#crop_or_parent`
- Add Rails caching for expensive aggregate queries in `Charts::CropsController`
- Add fragment caching for high-impact sections on the crop show page

Co-authored-by: CloCkWeRX <365751+CloCkWeRX@users.noreply.github.com>

* Fix header spec failure due to memoized unread_count

- Reset `@unread_count` in `spec/views/layouts/_header_spec.rb` to ensure the updated notification count is rendered correctly.

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:
Daniel O'Connor
2026-05-03 14:47:59 +09:30
committed by GitHub
parent 035210197f
commit 3d63d12908
2 changed files with 10 additions and 7 deletions

View File

@@ -165,9 +165,11 @@ class Crop < ApplicationRecord
end
def all_companions
return companions unless parent
(companions + parent.all_companions).uniq
@all_companions ||= if parent
(companions + parent.all_companions).uniq
else
companions
end
end
before_destroy :destroy_reverse_companionships

View File

@@ -36,10 +36,11 @@
= cute_icon
= render 'predictions', crop: @crop
- if @crop.all_companions.any?
%section.companions
%h2 Companions
- @crop.all_companions.each do |companion|
= render 'crops/tiny', crop: companion
- cache [@crop, 'companions'] do
%section.companions
%h2 Companions
- @crop.all_companions.each do |companion|
= render 'crops/tiny', crop: companion
- if crop_or_parent(@crop, :en_youtube_url).present?
%section.youtube