我正在尝试从我的rails应用程序发送推送通知,该应用程序每隔7天安排在上午10点作为cronjob使用每当gem。
问题是我有来自不同时区的用户。来自US,EU,AUS,IND等。如果我从UTC时间上午10点开始触发,那么用户可能会在午夜收到通知,这对于打扰别人的睡眠是非常可怕的。
如何安排每个TimezoneUser在其时区上午10点接收通知。
我正在为每个用户保存时区。
user_id time_zone
153 +10:00
155 +05:30
答案 0 :(得分: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
,依此类推。
答案 1 :(得分:1)
在这种情况下,您可以编写一个rake任务,因此您仍然可以访问编写Ruby的Rails应用程序,并且可以随时通过cron作业运行该任务。
lib/tasks/send_emails.rake
的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来运行任务rake,如:
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'