From 9a3274345dc83096a9bdea612ec77cb2406fef21 Mon Sep 17 00:00:00 2001 From: erdgeist Date: Thu, 2 Jul 2026 15:13:40 +0200 Subject: Fix DST drift in occurrence generation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Occurrence.generate_dates: use ChaosCalendar::occurrences_for_timezone with Time.zone.tzinfo.identifier — occurrences now keep wall-clock time across DST boundaries (19:00 stays 19:00 in summer and winter); requires chaoscalendar gem with occurrences_for_timezone support (Gemfile.lock bumped accordingly) - Occurrence.find_in_range: joins(:event) inner join excludes occurrences whose event no longer exists (107k orphaned rows from the pre-revival calendar era were purged from the test DB); includes(:node) retained for eager loading; column references qualified with table name --- Gemfile.lock | 2 +- app/models/occurrence.rb | 12 +++++++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index b5c5c77..2e9a1ce 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -8,7 +8,7 @@ GIT GIT remote: https://github.com/erdgeist/chaoscalendar.git - revision: 3c0b34dd260f11d15378a6255d9862d629c8413a + revision: 48fe5c517ae3895cc78d9d2fefbdd35b90d52ba7 branch: erdgeist-ruby1.9 specs: chaos_calendar (0.1.3) diff --git a/app/models/occurrence.rb b/app/models/occurrence.rb index 777be24..41ef4cb 100644 --- a/app/models/occurrence.rb +++ b/app/models/occurrence.rb @@ -10,9 +10,10 @@ class Occurrence < ApplicationRecord # Class Methods def self.find_in_range start_time, end_time - includes(:node) - .where("start_time > ? AND end_time < ?", start_time, end_time) - .order("start_time") + joins(:event) + .includes(:node) + .where("occurrences.start_time > ? AND occurrences.end_time < ?", start_time, end_time) + .order("occurrences.start_time") end def self.find_next @@ -48,10 +49,11 @@ class Occurrence < ApplicationRecord # Return value is always an array of Time objects. def self.generate_dates event if event.rrule && !event.rrule.empty? - ChaosCalendar::occurrences( + ChaosCalendar::occurrences_for_timezone( event.start_time, (Time.now + 5.years), - event.rrule + event.rrule, + Time.zone.tzinfo.identifier ) else [event.start_time] -- cgit v1.3