知道如何使用从某个位置生成的时区来创建具有相应邮政编码的新记录吗?
我创建了一个服务对象来帮助提取邮政编码信息。
我可以在终端中使用此信息来设置邮政编码,但是当我尝试使用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来设置事件的时区。同样,这可以在控制台中运行,但不能通过回叫。记录不是通过浏览器创建的,而是在控制台中创建的。
答案 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