show moods for a year

This commit is contained in:
Christophe Robillard 2025-10-03 18:03:46 +02:00
parent 20b2d3ce4a
commit 957cd3a908
2 changed files with 36 additions and 15 deletions

View file

@ -1,6 +1,6 @@
class MoodsController < ApplicationController class MoodsController < ApplicationController
def index def index
@mode = Mood.last&.mode || "croisiere" @mode = Mood.last&.mode || "croisiere"
@mood_log = Mood.log || [] @mood_log = Mood.history_for_a_year || []
end end
end end

View file

@ -1,24 +1,45 @@
class Mood < ApplicationRecord class Mood < ApplicationRecord
def self.log class << self
return if Mood.count < 1 def history_for_a_year
history(Date.today - 1.year, Date.today)
end
first_mood = Mood.order(:recorded_at).first.recorded_at.to_date private
first_monday = first_mood - (first_mood.wday - 1) def history(from, to)
return [] if Mood.count < 1
first_monday = monday_of_the_week(first_mood_date(from))
current_date = first_monday current_date = first_monday
current_mode = nil current_mode = last_mode_before(current_date)
log_mood = [] log_mood = []
Mood.order(:recorded_at).all.each do |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 while current_date < mood.recorded_at.to_date do
log_mood << [ current_date.to_s, current_mode ] log_mood << [ current_date.to_s, current_mode ]
current_date += 1 current_date += 1
end end
current_mode = mood.mode current_mode = mood.mode
end end
while current_date <= Date.today do
while current_date <= to.to_date do
log_mood << [ current_date.to_s, current_mode ] log_mood << [ current_date.to_s, current_mode ]
current_date += 1 current_date += 1
end end
log_mood.each_slice(7).to_a.last(52) log_mood.each_slice(7).to_a
end
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
end end
end end