Time.zone работает на API, но не на рабочих - PullRequest
0 голосов
/ 05 апреля 2019

Я создаю API с использованием Grape Framework и хочу установить часовой пояс по умолчанию для всего приложения как UTC, чтобы при вызове Time.zone.now я получал правильное время

Мой config/application.rb выглядит так:

$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'api'))
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'app'))
$LOAD_PATH.unshift(File.dirname(__FILE__))

require 'bundler/setup'

Bundler.require :default, ENV['RACK_ENV']

Time.zone = 'UTC'

require_rel '../app'
require_rel '../api'
require_rel '../lib'
require_rel 'initializers'

Если я начну через bundle exec rackup -p 3000 или bin/console и позвоню Time.zone.now, я получу подходящее время: Fri, 05 Apr 2019 00:47:23 UTC +00:00

Хотя, когда я использую работника Sidekiq или что-то вне Rack (bundle exec sidekiq -r ./config/application.rb) и пытаюсь вызвать p Time.zone, возвращается nil и Time.current возвращает время с моим часовым поясом: 2019-04-04 21:48:57 -0300 , хотя мне требуется application.rb, который содержит Time.zone = 'UTC' оператор

Как установить глобальный часовой пояс UTC для моих работников?

РЕДАКТИРОВАТЬ # 1 - код работника

Это простой работник: он просто печатает Time.now или Time.zone.now

module Cron
  class Date
    include Sidekiq::Worker
    JOB_NAME = 'date_job'

    def perform(start_date = 1.day.ago, end_date = Time.current)
      p [Time.now, Time.current]
    end
  end
end

1 Ответ

0 голосов
/ 05 апреля 2019

Вы можете просто ввести ApplicationWorker и заставить всех других работников наследовать от этого класса. В этом новом родительском классе вы можете делать все, что объединяет всех работников.

Когда у вас есть два таких работника

class FooWorker
  include Sidekiq::Worker
  def perform
    # do something
  end
end

class BarWorker
  include Sidekiq::Worker
  def perform
    # do something else
  end
end

тогда вы можете использовать наследование следующим образом:

class ApplicationWorker
  include Sidekiq::Worker
  Time.zone = 'UTC'
end

class FooWorker < ApplicationWorker
  def perform
    # do something
  end
end

class BarWorker < ApplicationWorker
  def perform
    # do something else
  end
end
...