【问题标题】:How to send notifications according to time zone in rails?如何在rails中根据时区发送通知?
【发布时间】:2016-07-04 14:49:12
【问题描述】:

我正在尝试从我的 rails 应用程序发送推送通知,这些应用程序计划在每 7 天上午 10 点作为 cronjob 使用时长 gem。

问题是我有来自不同时区的用户。来自美国、欧盟、澳大利亚、印度等地。如果我从 UTC 时间上午 10 点触发,那么用户可能会在午夜收到通知,这是一件非常糟糕的事情来打扰某人的睡眠。

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

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

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

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    我会安排作业在所需的一周中的每一天每小时运行一次,检查哪些用户现在上午 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等等。

    【讨论】:

    • 感谢@mohamed 的回答,但它是一个硬编码的调度程序。如果日期是从 db 获取的,我该怎么办。我目前使用调度程序每 5 分钟检查一次是否应该在 5 分钟内运行通知。这就是为什么我不能在 schedule.rb 中硬编码
    【解决方案2】:

    在这种情况下,您可以编写一个 rake 任务,因此您仍然可以访问编写 Ruby 的 Rails 应用程序,并且可以随时通过 cron 作业运行该任务。

    假设您使用 PostgreSQL,您在 lib/tasks/send_emails.rake 的 rake 任务可能是:

    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'

    【讨论】:

    • 嘿@fercell 你能否详细说明一下,这看起来很有趣,但我没有一个明确的想法。
    猜你喜欢
    • 2019-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多