From 957cd3a9085fdc15475beb709138e0092c652d47 Mon Sep 17 00:00:00 2001 From: Christophe Robillard Date: Fri, 3 Oct 2025 18:03:46 +0200 Subject: [PATCH] show moods for a year --- app/controllers/moods_controller.rb | 2 +- app/models/mood.rb | 49 ++++++++++++++++++++--------- 2 files changed, 36 insertions(+), 15 deletions(-) diff --git a/app/controllers/moods_controller.rb b/app/controllers/moods_controller.rb index 15fc1ca..1589791 100644 --- a/app/controllers/moods_controller.rb +++ b/app/controllers/moods_controller.rb @@ -1,6 +1,6 @@ class MoodsController < ApplicationController def index @mode = Mood.last&.mode || "croisiere" - @mood_log = Mood.log || [] + @mood_log = Mood.history_for_a_year || [] end end diff --git a/app/models/mood.rb b/app/models/mood.rb index 5d28d11..4a851cc 100644 --- a/app/models/mood.rb +++ b/app/models/mood.rb @@ -1,24 +1,45 @@ class Mood < ApplicationRecord - def self.log - return if Mood.count < 1 + class << self + def history_for_a_year + history(Date.today - 1.year, Date.today) + end - first_mood = Mood.order(:recorded_at).first.recorded_at.to_date - first_monday = first_mood - (first_mood.wday - 1) + private + def history(from, to) + return [] if Mood.count < 1 - current_date = first_monday - current_mode = nil - log_mood = [] - Mood.order(:recorded_at).all.each do |mood| - while current_date < mood.recorded_at.to_date do + first_monday = monday_of_the_week(first_mood_date(from)) + + current_date = first_monday + current_mode = last_mode_before(current_date) + log_mood = [] + mood_range = Mood.order(:recorded_at).where(recorded_at: (first_monday..to)) + mood_range.each do |mood| + while current_date < mood.recorded_at.to_date do + log_mood << [ current_date.to_s, current_mode ] + current_date += 1 + end + current_mode = mood.mode + end + + while current_date <= to.to_date do log_mood << [ current_date.to_s, current_mode ] current_date += 1 end - current_mode = mood.mode + log_mood.each_slice(7).to_a end - while current_date <= Date.today do - log_mood << [ current_date.to_s, current_mode ] - current_date += 1 + + def first_mood_date(from) + Mood.order(recorded_at: :asc).where("recorded_at >= ?", from).first.recorded_at.to_date + end + + def monday_of_the_week(date) + date - date.wday + 1 + end + + def last_mode_before(date) + mood = Mood.where("recorded_at < ?", date).last + mood&.mode || "croisiere" end - log_mood.each_slice(7).to_a.last(52) end end