3

我有一些具有“published_on”属性的活动记录模型。当我尝试使用 1900 年 1 月 1 日之前的 published_on 日期缓存模型时,我收到如下错误:

Marshalling error for key 'popular_products': year too big to marshal: 1300 UTC
You are trying to cache a Ruby object which cannot be serialized to memcached.

我可以用 ruby​​ 重现类似的错误:

irb(main)> Marshal.dump( Time.parse("1/1/1900") )
ArgumentError: year too big to marshal: 1899 UTC

缓存日期早于 1900 年的模型的正确方法是什么?

4

2 回答 2

2

正如@j03w 评论的那样,这是 Time 类型的限制。我选择将类型更改为日期,从而解决了问题。

于 2013-08-23T13:40:43.687 回答
0

您还可以重载 Time 类的 _dump 和 _load 方法,如下所示:

require 'time' # Time extension to have xmlschema method
class Time
  def _dump(level)
    xmlschema(9) # store nsec
  end
  def self._load(str)
    Time.parse(str)
  end
end

irb(main):013:0> t=Time.new(1515,1,1)
=> 1515-01-01 00:00:00 +0100
irb(main):014:0> a=Marshal.dump(t)
=> "\x04\bIu:\tTime(1515-01-01T00:00:00.000000000+01:00\x06:\x06ET"
irb(main):015:0> t==Marshal.load(a)
=> true
于 2016-06-16T19:18:13.803 回答