Единственный способ сделать это - использовать функцию SQL, если вы используете MySQL, вы можете сделать это следующим образом:
Battle.where( 'HOUR( start_time ) >= ? AND HOUR( start_time ) <= ?', 12, 6 )
Но это крайне неэффективно и всегда будет генерировать полное сканирование таблицы и вы, конечно, этого не хотите.
Лучшее решение - это добавить столбцы с часовыми значениями только в вашей модели битвы, проиндексировать их и выполнить запрос непосредственно к ним следующим образом:
Battle.where( 'start_time_hour >= ? start_time_hour <= ?', 12, 6 )
Просто добавьте обратный вызов before_save, который устанавливает эти значения, перед сохранением вашей модели битвы на основе свойства start_time.
EDIT
BTW,Если вы используете PostgreSQL, он может создать индекс для результата функции, поэтому, если вы не возражаете против использования PostgreSQL, вы можете просто использовать функцию SQL.И прежде чем вы спросите, нет, я не знаю, как это работает, я знаю только, что база данных позволяет вам это делать, и что это недоступно в MySQL.