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 吗?的主要内容,如果未能解决你的问题,请参考以下文章

TFboy养成记 多层感知器 MLP

如何正确编写我的 clickhouse sql 查询?

intent用法

初识Activity

ActiveX控件

深入分析动态管理Fragment