Зная, что ваш день начинается в 9:00 и заканчивается в 8:30 следующего дня, хорошо иметь область для ваших данных.
Пример:
scope :for_day, -> (day) {
date_time_from = Time.zone.parse("#{day.strftime('%Y-%m-%d')} 9:00")
date_time_to = Time.zone.parse("#{(day + 1.day).strftime('%Y-%m-%d')} 8:30")
where(timestamp: (date_time_from..date_time_to))
}
Использование:
Weather.for_day(1.day.ago)
вернет: 08 May 2019 9:00 AM till 09 May 2019 8:30 AM
и затем вы можете делать с данными все, что захотите (например, group и max)
EDIT
Исходя из комментариев, я предполагаю, что вы хотите получить все данные. При этом лучше добавить в таблицу новый столбец с указанным днем.
Миграция
add_column :weathers, :day
add_index :weathers, :day
Weather.rb
class Weather < ApplicationRecord
before_save :set_date
scope :for_day, -> (day) {
where(day: day)
}
def self.dates_for_day(day)
date_time_from = Time.zone.parse("#{day.strftime('%Y-%m-%d')} 9:00")
date_time_to = Time.zone.parse("#{(day + 1.day).strftime('%Y-%m-%d')} 8:30")
return {
day: day,
from: date_time_from,
to: date_time_to
}
end
private
def set_day
# get the surrounding days to know which day to use
surrounding_days = [
Weather.dates_for_day(self.timestamp - 1.day),
Weather.dates_for_day(self.timestamp),
Weather.dates_for_day(self.timestamp + 1.day),
]
self.day = surrounding_days.select { |d| self.timestamp.between?(d[:from], d[:to]) }.first[:day]
end
end
Теперь вы можете запрашивать / группировать ваши данные так, как вы хотите