Интересная проблема! Таким образом, есть два случая: (1) нормальный сдвиг (где start_time <= end_time
) и (2) сдвиг, который перекрывает полночь (где start_time > end_time
).
Вы уже обрабатываете первый случай, проверяя, находится ли текущее время между временем начала и временем окончания.
Я полагаю, что второй случай может быть обработан путем проверки, является ли текущее время или между временем начала и полуночи, или между полуночью и временем окончания. Что переводится как start_time <= ? OR end_time >= ?
.
Я давно не пользовался Rails, но думаю, вы могли бы сделать что-то вроде этого:
@current ||= Shift
.where('start_time <= end_time')
.where('start_time <= ?', current_time)
.where('end_time >= ?', current_time)
.or(Shift
.where('start_time > end_time')
.or(Shift
.where('start_time <= ?', current_time)
.where('end_time >= ?', current_time)))
.first()
Если вы пойдете с этим, рассмотрите возможность разделения двух случаев на отдельные области действия , чтобы вы могли написать что-то более читаемое, например, в этом методе:
@current ||= current_normal_shifts.or(current_dawn_shifts).first