Datetime 为什么实现ActiveRecord访问器会改变时间的工作方式?
我已经把一个bug缩小到一个非常具体的例子。我找不到这种行为的理由 这种行为是这样的:Datetime 为什么实现ActiveRecord访问器会改变时间的工作方式?,datetime,ruby-on-rails-4,activerecord,Datetime,Ruby On Rails 4,Activerecord,我已经把一个bug缩小到一个非常具体的例子。我找不到这种行为的理由 这种行为是这样的: 假设一个带有日期时间字段的ActiveRecord(在我的例子中,它是Offer)(在我的例子中,它是Scheduled\u at) 在时间中设置字段。使用区域(“UTC”)块 在没有其他干预的情况下,在.hour阅读scheduled_ 断言块内外的值相同 重新运行上述操作,但仅在.hour读取scheduled_out块 断言它与步骤4中的值相同 一切正常。 现在,我们打开Offer类并执行以下操作: O
Offer
)(在我的例子中,它是Scheduled\u at
)时间中设置字段。使用区域(“UTC”)
块scheduled_
scheduled_
out块Offer.class_eval do
def scheduled_at=(scheduled_at)
write_attribute(:scheduled_at, scheduled_at)
end
def scheduled_at
read_attribute(:scheduled_at)
end
end
运行上述步骤,并注意在进入第6步之前,我们一切正常
现在在上有一个副作用,它对我们第一次阅读它的时间很敏感
Q:这是什么原因?这是预期的吗?bug?
代码如下:
def test_strangeness
puts "first run"
do_stuff
puts "opening class"
Offer.class_eval do
def scheduled_at=(scheduled_at)
write_attribute(:scheduled_at, scheduled_at)
end
def scheduled_at
read_attribute(:scheduled_at)
end
end
puts "second run"
do_stuff
end
def do_stuff
o1 = Offer.new
Time.use_zone("UTC") do
o1.scheduled_at = Time.new(2015, 1, 2, 3, 45, 56, 0)
o1.scheduled_at.hour
end
hour1 = o1.scheduled_at.hour
puts "hour1 is #{hour1}"
o2 = Offer.new
Time.use_zone("UTC") do
o2.scheduled_at = Time.new(2015, 1, 2, 3, 45, 56, 0)
end
hour2 = o2.scheduled_at.hour
puts "hour2 is #{hour2}"
assert_equal hour1, hour2
end
我❤
def test_陌生度
这看起来像是一个记忆问题,因为唯一的区别是您在时间内调用getter;在第一个对象中结束。但我不知道确切的问题是什么。不过,这看起来是有意的。