【发布时间】:2015-06-23 09:33:42
【问题描述】:
有人知道在尝试序列化Date 或Time 对象时避免出现ActiveJob::SerializationError 的干净方法吗?
到目前为止,我有两个解决方案是:
- 在加载参数时调用 Marshal/JSON/YAML
dump,然后在作业中调用load(这很糟糕,因为我需要对邮件程序进行修补) - 猴子补丁
Date和Time像这样:
/lib/core_ext/time.rb
class Time
include GlobalID::Identification
def id
self.to_i
end
def self.find(id)
self.at(id.to_i)
end
end
/lib/core_ext/date.rb
class Date
include GlobalID::Identification
def id
self.to_time.id
end
def self.find(id)
Time.find(id).to_date
end
end
这也很糟糕。谁有更好的解决方案?
【问题讨论】:
-
真的有必要只将日期或时间传递给工作(以及为什么)?我认为最好将 ActiveModel 作为参数传递给作业,可能包含 Date 或 Time 实例。 (ActiveModel 包含 GlobalID::Identification,因此它们是可序列化的)
-
不,没有必要。这只是方便。最重要的是,在我们集成 ActiveJob 之前,它与 DelayedJob 一起工作。所以......看起来很愚蠢,我需要更改我的代码才能与简单地应该抽象而不是更改功能的东西集成。
-
您只将日期/时间对象加入队列?没有其他的? AFAIK,ActiveJob 实际上调用 Marshal 来序列化您的对象,并且需要类似于您所说的猴子补丁之类的东西,以便以后能够检索和调用该对象。你能发布你的邮件吗?
-
@kddeisz 还有
WHITELIST方法:stackoverflow.com/questions/27629697/monkeypatching-activejobs -
你能举个例子说明你是如何排队的吗?
标签: ruby-on-rails ruby ruby-on-rails-4 rails-activejob