Je verliest je tijdzones uit het oog als je to_date call belt dus doe dat niet:
@today = Time.now.in_time_zone(@person.time_zone).midnight.utc
@tomorrow = @today + 1.day
Wanneer je some_date.to_datetime , krijg je een DateTime-instantie die in UTC is, dus het resultaat van zoiets als dit:
Time.now.in_time_zone(@person.time_zone).midnight.to_date.to_datetime
zal een tijd van de dag hebben van 00:00:00 en een tijdzone van UTC; de 00:00:00 is de juiste tijd van de dag in @person.time_zone maar niet geschikt voor UTC (tenzij, natuurlijk, @person bevindt zich in de +0 tijdzone).
En je zou je zoekopdracht kunnen vereenvoudigen met overlaps :
where(
'(start_time, end_time) overlaps (timestamp :today, timestamp :tomorrow)',
:today => @today, :tomorrow => @tomorrow
)
Merk op dat overlaps werkt met halfopen intervallen:
Elke tijdsperiode wordt beschouwd als het halfopen interval
start <= time < end, tenzij begin en einde gelijk zijn, in welk geval het dat ene moment vertegenwoordigt.