2016-07-04 2 views
4

Я пытаюсь отправить push-уведомления из моих приложений-рельсов, которые запланированы на каждый 7-й день в 10 утра в качестве cronjob, использующего каждый раз, когда он будет.Как отправлять уведомления в соответствии с часовым поясом в рельсах?

Проблема в том, что у меня есть пользователи из разных часовых поясов. из США, ЕС, AUS, IND и т. д. Если я начну с UTC 10 часов, то пользователи могут получать уведомления в полночь, это очень ужасно, чтобы нарушить чей-то сон.

Что я могу сделать, чтобы каждый пользователь TimezoneUser получал уведомление в 10 часов своего часового пояса.

Я экономя часовой пояс для каждого пользователя.

user_id time_zone 
153  +10:00 
155  +05:30 

ответ

3

Я планирую, чтобы работа выполнялась каждый час в желаемый день недели, проверяйте, какие пользователи имеют время 10 утра и отправляют им. Таким образом, вы запускаете работу 24 раза в один день недели, охватывая все мировые часовые пояса.

every '0 * * * 1' do 
    # Send notification to users that are at 10am now 
end 

В приведенном выше примере, 0 * * * 1 является соответствующей. (at minute 0) (every hour) (every day) (every month) (first day of week -Monday-)

Если вы хотите отправить уведомление в воскресенье, например, номер должен быть 7, вторник - 2 и так далее.

+0

Спасибо за ответ @mohamed но его жесткого кодированный планировщик. что мне делать, если дата получена из db. Я в настоящее время проверяю каждые 5 минут с помощью планировщика, чтобы, если я должен запустить уведомление в течение 5 минут. вот почему я не мог жестко закодировать в schedule.rb – Prem

1

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

Ваша задача рек в lib/tasks/send_emails.rake Если предположить, что с помощью PostgreSQL может быть:

namespace :users do 
    desc "use like rake users:send_emails" 
    task send_emails: :environment do 
     ActiveRecord::Base.transaction do 
     users = User.where("current_timestamp::TIMESTAMPTZ AT TIME ZONE INTERVAL time_zone::INTERVAL > ?", Time.zone.parse("2016/07/06 00:00")) 
     UsersMailer.send_newsletters(users).deliver_now 
     end 
    end 
end 

И тогда вы установите cronjob для запуска задачи грабель, как: 0 * * * * /bin/bash -l -c 'cd /home/your_user_name/path_to_rails_application/current/ && ~/.rvm/bin/rvm default do bundle exec rake users:send_emails RAILS_ENV=production --silent'

+0

эй @fercell вы могли бы подробнее рассказать о том, что это интересно, но у меня нет четкой идеи. – Prem

+0

Я только что обновил ответ @Lannister – Fercell

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