【问题标题】:Rails set config.active_record.default_timezone to value other than :utc or :localRails 将 config.active_record.default_timezone 设置为 :utc 或 :local 以外的值
【发布时间】:2018-09-27 05:17:38
【问题描述】:

我的应用时区设置为太平洋。

# 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"  

docs 说我对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"

【问题讨论】:

  • 乍一看它是系统本地的,但看起来from reading,它可能是应用程序本地的。您是否已验证 config.timezone 到正确的区域,而 default_timezone 到 :local 实际上不起作用,与系统时区无关?我怀疑会的。我们经常这样做,但系统时间通常也设置为首选时区。
  • @BradWerth 我添加了一个编辑以显示两个配置变量都已设置。谢谢

标签: ruby-on-rails postgresql rails-activerecord


【解决方案1】:

查看 github 上的 PostgreSQLAdapter source,我看到检查变量哈希是否存在“时区”键。

      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 docs 表明:variablesconfig/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/ 中设置它,这有点奇怪,但它确实有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-24
    • 1970-01-01
    • 1970-01-01
    • 2014-10-09
    • 1970-01-01
    • 2021-02-06
    相关资源
    最近更新 更多