From 311f06e404ae6e27ea2c47ce2a09f2f689353ea4 Mon Sep 17 00:00:00 2001 From: "Sure Admin (bot)" Date: Tue, 25 Aug 2026 04:02:01 +0200 Subject: [PATCH] Fix budget cache invalidation after transaction deletion (#2808) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Juan José Mata Co-authored-by: Juan José Mata --- app/models/family.rb | 5 +---- test/models/family_test.rb | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/app/models/family.rb b/app/models/family.rb index 5964431d9..da3dbf3de 100644 --- a/app/models/family.rb +++ b/app/models/family.rb @@ -493,10 +493,7 @@ class Family < ApplicationRecord # Used for invalidating entry related aggregation queries def entries_cache_version - @entries_cache_version ||= begin - ts = entries.maximum(:updated_at) - ts.present? ? ts.to_i : 0 - end + "#{entries.count}-#{entries.maximum(:updated_at)&.to_f || 0}" end # Used for invalidating caches keyed on entries (e.g. the transactions diff --git a/test/models/family_test.rb b/test/models/family_test.rb index 53ffadd0e..f55cd7cb1 100644 --- a/test/models/family_test.rb +++ b/test/models/family_test.rb @@ -165,6 +165,28 @@ class FamilyTest < ActiveSupport::TestCase assert_equal "Groups", family.moniker_label_plural end + test "entries_cache_version changes when an older entry is destroyed" do + family = families(:dylan_family) + newer_entry = entries(:transaction) + older_entry = Entry.create!( + account: accounts(:depository), + entryable: Transaction.create!(category: categories(:food_and_drink)), + date: Date.current, + name: "Older duplicate", + amount: 42, + currency: "USD", + created_at: 2.days.ago, + updated_at: 2.days.ago + ) + + newer_entry.update!(updated_at: 1.day.ago) + + before_destroy = family.reload.entries_cache_version + older_entry.destroy! + + assert_not_equal before_destroy, family.reload.entries_cache_version + end + test "default currency comes from country ISO data" do assert_equal "CAD", Family.default_currency_for_country("CA") assert_equal "EUR", Family.default_currency_for_country("DE")