2016-03-22 2 views
5

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

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

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

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

Лучшие

+0

Использовать метод in_time_zone для класса DateTime, например: 'Object.created_at.in_time_zone ('Eastern Time (US)')', и тогда вы можете иметь проверочный пробег (9 ... 5) этого объекта datetime проверьте день. –

ответ

3

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

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

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» отойдут список всех часовых поясов, то сопоставить их возвращать только имена тех, которые в настоящее время есть час, который находится между 8AM (8) и 8 вечера (20). Затем мы используем массив, возвращаемый картой в запросе для пользователей.

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

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

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

+0

Ницца! Как насчет версии rails5?! – Ben

+0

Конечно, версия Rails 5 на самом деле является лучшим способом сделать это: использовать --- ActiveSupport :: TimeZone.all --- вместо --- ActiveSupport :: TimeZone.zones_map.values ​​--- Также работает в Rails 4 , – MTarantini

Смежные вопросы