Есть несколько способов сделать это в базе данных, которые гораздо более производительны, чем загрузка нескольких записей в Rails.
Хотя решения «чистого рубина» - это быстрое решение, они исчерпают доступную память иаварийно завершить работу сервера при наличии нетривиального количества записей.
Вы можете использовать диапазон вместе с .where
, чтобы создать предложение WHERE start_time BETWEEN a AND b
, гарантирующее, что время находится в пределах A и B.
starts_today = Model.where(
start_time: Time.current.beginning_of_day..Time.current.end_of_day
)
Если вы хотите убедиться, что весь промежуток между start_time
и end_time
находится в пределах набора, вы можете написать свое собственное условие where:
Model.where(
"start_time > :a AND end_time < :b",
a: Time.current.beginning_of_day,
b: Time.current.end_of_day
)
Мне нужночтобы узнать, сколько часов находится во временном интервале.
Вы можете сделать это с помощью функций времени / даты в вашей базе данных.Например, на postgres вы можете сделать:
bounds = Time.current.beginning_of_day..Time.current.end_of_day
Model.select(
"models.*, (EXTRACT(HOUR FROM end_time - start_time ) - EXTRACT(HOUR FROM end_time - '#{ bounds.end.iso8601 }')) AS number_of_hours"
)
Повторное вычисление этого в БД жизненно необходимо, если вы, например, хотите использовать это в предложении WHERE.