Tracisz kontrolę nad strefami czasowymi, dzwoniąc do to_date więc nie rób tego:
@today = Time.now.in_time_zone(@person.time_zone).midnight.utc
@tomorrow = @today + 1.day
Kiedy some_date.to_datetime , otrzymasz instancję DateTime, która jest w UTC, więc wynik czegoś takiego:
Time.now.in_time_zone(@person.time_zone).midnight.to_date.to_datetime
będzie miał godzinę 00:00:00 i strefę czasową UTC; 00:00:00 to poprawna pora dnia w @person.time_zone ale nie jest odpowiedni dla UTC (chyba że, oczywiście, @person jest w strefie czasowej +0).
I możesz uprościć zapytanie dzięki overlaps :
where(
'(start_time, end_time) overlaps (timestamp :today, timestamp :tomorrow)',
:today => @today, :tomorrow => @tomorrow
)
Zauważ, że overlaps działa z przerwami półotwartymi:
Każdy okres jest uważany za reprezentujący przedział półotwarty start <= time < end , chyba że początek i koniec są równe, w którym to przypadku reprezentuje ten pojedynczy moment.