rails // запрос по часовому поясу в дневное время

Не так уверенно, когда дело доходит до использования часовых поясов, ищу помощь в этом

У меня есть задание cron, которое время от времени проверяет пользователей, что вызывает задачу rake. В рамках этой рейк-задачи я опрашиваю пользователей и отправляю каждому по электронной почте базу на условиях.

У меня есть информация о часовом поясе для каждого пользователя. Я хотел бы получить запрос для тех пользователей, который будет возвращать только пользователей, которые в настоящее время находятся в дневное время.

Как бы этого добиться?

Лучший


person Ben    schedule 22.03.2016    source источник
comment
Используйте метод in_time_zone класса DateTime, например: Object.created_at.in_time_zone('Eastern Time (US)'), а затем вы можете проверить между? (9... 5) этот объект datetime, чтобы проверить дневное время.   -  person Muhammad Yawar Ali    schedule 22.03.2016


Ответы (1)


Это зависит от нескольких разных вещей, но я буду исходить из того, как настроен мой сайт. В моей пользовательской модели есть столбец с именем часовой пояс, пример того, как часовые пояса хранятся в этом столбце: «США/Центральный».

Я бы сделал это, собрав массив имен часовых поясов, которые в настоящее время находятся в определенном временном диапазоне, а затем запросив таблицу User.

zones = ActiveSupport::TimeZone.zones_map.values.
  map { |z| z.name if (8..20).cover?(z.now.hour) }.compact
users = User.where(timezone: zones)

Часть «zones_map.values» выведет список всех часовых поясов, затем мы сопоставим их так, чтобы возвращались только имена тех, у которых в настоящее время есть час, который находится между 8:00 (8) и 8:00 (20:00). Затем мы используем массив, возвращенный картой, в запросе для пользователей.

Таким образом, «z.now» даст нам текущее время в этом часовом поясе, и мы используем «(8..20).cover?» чтобы увидеть, находится ли «z.now.hour» в диапазоне от 8 до 20.

** Часы выше 12 не будут сбрасываться на 1, а будут продолжаться как 13, 14 и т. д.

Не уверен, что есть более быстрый/эффективный способ, но именно так я нашел способ, чтобы он оставался запросом и избегал зацикливания всех пользователей.

person MTarantini    schedule 22.03.2016
comment
Хороший! Что насчет версии rails5?! - person Ben; 23.03.2016
comment
Конечно, версия для Rails 5 на самом деле лучший способ сделать это: используйте ---ActiveSupport::TimeZone.all--- вместо ---ActiveSupport::TimeZone.zones_map.values--- Также работает в Rails 4. - person MTarantini; 24.03.2016