如何根据rails中的时区发送通知?

时间:2016-07-04 14:49:13

标签: ruby-on-rails ruby

我正在尝试从我的rails应用程序发送推送通知,该应用程序每隔7天安排在上午10点作为cronjob使用每当gem。

问题是我有来自不同时区的用户。来自US,EU,AUS,IND等。如果我从UTC时间上午10点开始触发,那么用户可能会在午夜收到通知,这对于打扰别人的睡眠是非常可怕的。

如何安排每个TimezoneUser在其时区上午10点接收通知。

我正在为每个用户保存时区。

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

2 个答案:

答案 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'