Když zavoláte to_date, ztrácíte přehled o svých časových pásmech tak to nedělej:
@today = Time.now.in_time_zone(@person.time_zone).midnight.utc
@tomorrow = @today + 1.day
Když some_date.to_datetime , získáte instanci DateTime, která je v UTC, takže výsledek je něco takového:
Time.now.in_time_zone(@person.time_zone).midnight.to_date.to_datetime
bude mít denní čas 00:00:00 a časové pásmo UTC; 00:00:00 je správný čas dne v @person.time_zone ale není to vhodné pro UTC (samozřejmě pokud @person je v časovém pásmu +0).
A můžete svůj dotaz zjednodušit pomocí overlaps :
where(
'(start_time, end_time) overlaps (timestamp :today, timestamp :tomorrow)',
:today => @today, :tomorrow => @tomorrow
)
Všimněte si, že se overlaps pracuje s pootevřenými intervaly:
Každé časové období je považováno za napůl otevřený interval
start <= time < end, pokud nejsou začátek a konec stejné, v takovém případě představuje tento jediný časový okamžik.