在单个模型上设置default_timezone

时间:2012-02-16 15:22:15

标签: ruby-on-rails ruby-on-rails-3 timezone rails-activerecord utc

我从一个从其他系统提供的数据库中读取了一个问题,因为我只能读取它,并将日期时间存储在:本地时区。

与Rails 3.2应用程序一样,它“应该”存储在:utc中,作为此应用程序中的所有其他表格。

我需要这个模型才能进入:本地。其余的必须是:utc

我当地的时区是'UTC -04:00'

class ExternalTable < ActiveRecord::Base
  establish_connection :otherdb
  table_name :iseries_table  <-- I have to live with it.
  default_timezone = :local
  puts "my default timezone is #{default_timezone}"

  #lot's of defs
   .....
end

运行“rails c”

> ExternalTable.inspect
«lot´s of attributes»
my default timezone is :utc  <---utc!?. I have just set it to :local!?!?!?

> ExternalTable.default_timezone 
:utc

> ExternalTable.default_timezone = :local
:local

> ExternalTable.default_timezone 
:local  <--- yeah, right. Setting it AFTER instantiated, works.

所以,似乎Rails将所有ActiveRecord.Base时区设置回:utc,在初始化之后,覆盖ActiveRecord的默认值,即:local。

有很多方法可以解决这个问题,例如在每个控制器上设置一个before_filter,但它似乎并不像Rubyist那样。

2 个答案:

答案 0 :(得分:2)

不应该是:

self.default_timezone = :local

否则,您将创建一个名为“default_timezone”的局部变量。

如果您只想将它​​应用于一个类,您可以创建一个单例方法:

class ExternalTable < ActiveRecord::Base
  def self.default_timezone
    :local
  end
end

有点hackish但应该工作。

答案 1 :(得分:1)

在Rails 6中,您已经可以写为问题了,它将把从BiLocalTimeRecord继承的每个类都设置为datetime为本地时间。

    module Bi
      class BiLocalTimeRecord < ActiveRecord::Base
        self.abstract_class = true
        self.default_timezone = :local
        establish_connection :cybros_bi
      end
    end