Mongoid::Document 是 ActiveJobs 的 GlobalID::Identification 吗?
Posted
技术标签:
【中文标题】Mongoid::Document 是 ActiveJobs 的 GlobalID::Identification 吗?【英文标题】:Is Mongoid::Document a GlobalID::Identification for ActiveJobs? 【发布时间】:2015-03-05 10:26:11 【问题描述】:根据ActiveJobs guide,第 8 节,它说:
这适用于任何混入 GlobalID::Identification 的类, 默认情况下,它已混合到 Active Model 类中。
Mongoid::Document
混合了ActiveModel::Model
,但我在其包含的模块中找不到GlobalID::Identification
。
GlobalID::Identification
在哪里定义?
我可以有效地将任何Mongoid::Document
用于我的 ActiveJobs 吗?
【问题讨论】:
【参考方案1】:指南中有错误。 GlobalID::Identification
已混入 ActiveRecord
。如果您将GlobalID::Identification
混入到您的mongoid 文档中,它将自动工作,因为GID 要求实例响应id
(返回uniq 标识符)和响应find
的类(传递id
将返回一条记录)。
【讨论】:
如果它可以帮助其他人,您可以通过在模型顶部添加include GlobalID::Identification
来“混合”。【参考方案2】:
要向遇到相同问题的任何人提供更多信息,您只需将GlobalID::Identification
添加到您的模型即可使其正常工作。
class User
include Mongoid::Document
include GlobalID::Identification
end
我实际上是通过重新打开 Mongoid::Document
来做到这一点的:
module Mongoid::Document
include GlobalID::Identification
end
但是,我有时会遇到一些非常奇怪的错误,ActiveJob
不知道如何序列化我的模型。我试图调试它,但每当我遇到ActiveJob
代码时,我都会:
pry> User.is_a? GlobalID::Identification
=> true
但是ActiveJob::Arguments.serialize_argument 没有按预期工作。
解决方法也是重新打开Mongoid::Relations::Proxy
:
class Mongoid::Relations::Proxy
include GlobalID::Identification
end
【讨论】:
你能重现SerializationError
这个错误吗?
我已经尝试过一个简单的应用程序,但它没有用。我在一个复杂的应用程序中遇到了这个问题,但我还没有找到任何导致这个错误发生的原因。在带有此代码的引擎中,它运行良好,但是当我在 Rails 应用程序中使用它时,我可以看到我的模型有 GlobalID::Identification
但其中一些无法正确序列化
我为此奋斗了一段时间,我看到的是一个从 belongs_to 关联中提取的对象没有报告为 GlobalID::Identification
对象。我的解决方法是将GlobalID::Identification
也包含在Mongoid::Relations::Proxy
中。我相信它与 mongoid 使用 marshalable 有关,但我不完全确定。
感谢@c.apolzon 的评论,如果可行,我会尽快尝试并添加到我的帖子中。
我猜这段代码应该放在初始化器中?【参考方案3】:
在你的初始化器中加入这样的东西:
# config/initalizers/mongoid.rb
if defined?(Mongoid)
# GlobalID is used by ActiveJob (among other things)
# https://github.com/rails/globalid
Mongoid::Document.send(:include, GlobalID::Identification)
Mongoid::Relations::Proxy.send(:include, GlobalID::Identification)
end
【讨论】:
当我尝试这个时我得到uninitialized constant Mongoid::Relations
。
对于mongoid >= 7
,它是Mongoid::Association::Proxy
,而不是Mongoid::Relations::Proxy
以上是关于Mongoid::Document 是 ActiveJobs 的 GlobalID::Identification 吗?的主要内容,如果未能解决你的问题,请参考以下文章