Rails устанавливает config.active_record.default_timezone значение, отличное от: utc или: local - PullRequest
0 голосов
/ 27 сентября 2018

Часовой пояс моего приложения установлен на Pacific.

# application.rb: 
config.time_zone = 'Pacific Time (US & Canada)'  

Для моего рабочего сервера установлено тихоокеанское время.Но ActiveRecord устанавливает часовой пояс postgres для сеанса в 'UTC':

[1] pry(main)> ActiveRecord::Base.connection.execute("show timezone").getvalue(0,0)
  (0.2ms)  show timezone
=> "UTC"  

. Документы говорят, что у меня только два варианта для config.active_record.default_timezone: :utc и :local

Использование :local хорошо для производства, но мой сервер разработки находится в другом часовом поясе.

Я знаю, что часто рекомендуется оставить все настройки часового пояса в UTC по умолчанию, но мое приложениеинтенсивно использует функции времени и даты postgres для заданий ETL, сложных запросов анализа данных и т. д. Я бы предпочел, чтобы postgres был моим «единственным источником правды», а не rails / ruby, поэтому мне не интересны ответы, которые говорят мне делать всев UTC

Редактировать: я подтвердил, что config.time_zone установлен правильно:

[6] pry(main)> Rails.application.config.time_zone
=> "Pacific Time (US & Canada)"

и config.active_record.default_timezone установлено на :local

[9] pry(main)> Rails.application.config.active_record.default_timezone
=> :local

в том же сеансе:

[10] pry(main)> ActiveRecord::Base.connection.execute("show timezone").getvalue(0,0)
   (0.2ms)  show timezone
=> "Asia/Bangkok"

1 Ответ

0 голосов
/ 27 сентября 2018

Посмотрев на PostgreSQLAdapter source на github, я увидел, что хэш переменных проверяется на наличие ключа "timezone".

      variables = @config.fetch(:variables, {}).stringify_keys

      # If using Active Record's time zone support configure the connection to return
      # TIMESTAMP WITH ZONE types in UTC.
      unless variables["timezone"]
        if ActiveRecord::Base.default_timezone == :utc
          variables["timezone"] = "UTC"
        elsif @local_tz
          variables["timezone"] = @local_tz
        end
      end

Документы PostgreSQLAdapter показывают, что :variables - это опция в config/database.yml, поэтому я просто добавил variables: {timezone: 'US/Pacific'} в database.yml.

# database.yml
default: &default
  adapter: postgresql
  encoding: unicode
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  variables: {timezone: 'US/Pacific'}

Довольно странно, что вы должны установить это здесь вместо config/, но это работает.

...