Du mister overblikket over dine tidszoner, når du ringer til to_date så gør det ikke:
@today = Time.now.in_time_zone(@person.time_zone).midnight.utc
@tomorrow = @today + 1.day
Når du some_date.to_datetime , får du en DateTime-forekomst, der er i UTC, så resultatet af noget som dette:
Time.now.in_time_zone(@person.time_zone).midnight.to_date.to_datetime
vil have et klokkeslæt på 00:00:00 og en tidszone på UTC; 00:00:00 er det korrekte tidspunkt på dagen i @person.time_zone men ikke rigtigt for UTC (medmindre, selvfølgelig, @person er i +0 tidszonen).
Og du kan forenkle din forespørgsel med overlaps :
where(
'(start_time, end_time) overlaps (timestamp :today, timestamp :tomorrow)',
:today => @today, :tomorrow => @tomorrow
)
Bemærk, at overlaps virker med halvåbne intervaller:
Hver tidsperiode anses for at repræsentere det halvåbne interval start <= time < end , medmindre start og slut er ens, i hvilket tilfælde det repræsenterer det enkelte tidsøjeblik.