Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Datetime 为什么实现ActiveRecord访问器会改变时间的工作方式?_Datetime_Ruby On Rails 4_Activerecord - Fatal编程技术网

Datetime 为什么实现ActiveRecord访问器会改变时间的工作方式?

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

我已经把一个bug缩小到一个非常具体的例子。我找不到这种行为的理由

这种行为是这样的:

  • 假设一个带有日期时间字段的ActiveRecord(在我的例子中,它是
    Offer
    )(在我的例子中,它是
    Scheduled\u at
  • 时间中设置字段。使用区域(“UTC”)
  • 在没有其他干预的情况下,在.hour阅读
    scheduled_
  • 断言块内外的值相同
  • 重新运行上述操作,但仅在.hour读取
    scheduled_
    out块
  • 断言它与步骤4中的值相同
  • 一切正常。

    现在,我们打开Offer类并执行以下操作:

    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;在第一个对象中结束。但我不知道确切的问题是什么。不过,这看起来是有意的。