Как мне написать запрос activerecord, который смотрит только на компонент времени поля datetime? - PullRequest
3 голосов
/ 25 июля 2011

Можно ли сделать запрос activerecord, который просматривает только компонент времени поля datetime?

например. Battle.where('start_time < ? and start_time > ?','12:00','06:00')

чтобы найти все битвы, которые начались между 6:00 и 12:00, независимо от дня, когда они произошли? В этом примере start_time определяется как datetime.

1 Ответ

6 голосов
/ 25 июля 2011

Единственный способ сделать это - использовать функцию 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...