Estás perdiendo la noción de tus zonas horarias cuando llamas a to_date así que no hagas eso:
@today = Time.now.in_time_zone(@person.time_zone).midnight.utc
@tomorrow = @today + 1.day
Cuando some_date.to_datetime , obtiene una instancia de DateTime que está en UTC, por lo que el resultado es algo como esto:
Time.now.in_time_zone(@person.time_zone).midnight.to_date.to_datetime
tendrá una hora del día de 00:00:00 y una zona horaria de UTC; las 00:00:00 es la hora del día correcta en @person.time_zone pero no para UTC (a menos, por supuesto, @person está en la zona horaria +0).
Y podría simplificar su consulta con overlaps :
where(
'(start_time, end_time) overlaps (timestamp :today, timestamp :tomorrow)',
:today => @today, :tomorrow => @tomorrow
)
Tenga en cuenta que overlaps funciona con intervalos entreabiertos:
Se considera que cada período de tiempo representa el intervalo semiabierto start <= time < end , a menos que el inicio y el final sean iguales, en cuyo caso representa ese único instante de tiempo.