设置每个记录的时区

时间:2014-04-12 01:56:12

标签: ruby-on-rails ruby activerecord

知道如何使用从某个位置生成的时区来创建具有相应邮政编码的新记录吗?

我创建了一个服务对象来帮助提取邮政编码信息。

我可以在终端中使用此信息来设置邮政编码,但是当我尝试使用before_save或before_create挂钩时它不起作用。

class ServiceObject
  include ActiveModel::Model

  def self.get_timezone_name(location)
    z = GoogleTimeZone.fetch(location.latitude, location.longitude)
    ActiveSupport::TimeZone.find_tzinfo(z.time_zone_id)
  end
end

class Location < ActiveRecord::Base
  has_many :events
  #name - String
  #start_time - DateTime
  #end_time - DateTime
end

class Event < ActiveRecord::Base
  belongs_to :location
  geocoded_by :full_address
  before_create :zoned

  private
  def zoned
    Time.zone = ServiceObject.get_time_zone(self.location)
  end

end

我还尝试使用日期时间属性gem来设置事件的时区。同样,这可以在控制台中运行,但不能通过回叫。记录不是通过浏览器创建的,而是在控制台中创建的。

1 个答案:

答案 0 :(得分:1)

这是我在时区上用rails写的一篇博文:http://jessehouse.com/blog/2013/11/15/working-with-timezones-and-ruby-on-rails/

有两种不同的方法可以实现您的目标:

    保存数据时
  • Time.use_zone阻止
  • 在显示数据时使用in_time_zone

我建议您将时区保存在您的位置,如果长/拉变化则更新时区;看起来上面的事件和位置示例被翻转了?事件应该有一个开始和结束,而不是位置?

class Location
  has_many :events

  geocoded_by :full_address
  before_save :set_time_zone

  private

  def set_time_zone
    if new_record? || latitude_changed? || longitude_changed?
      self.time_zone = ServiceObject.get_time_zone(self)
    end
  end
end

class Event
  belongs_to :location
end

然后在控制台或控制器代码中

location = Location.last
Time.use_zone(location.time_zone) do
  location.events << Event.new({ ... })
end