Mongoid::Document 是 ActiveJobs 的 GlobalID::Identification 吗?

Is Mongoid::Document a GlobalID::Identification for ActiveJobs?

根据 ActiveJobs guide,第 8 节,它说:

This works with any class that mixes in GlobalID::Identification, which by default has been mixed into Active Model classes.

Mongoid::Document 混合 ActiveModel::Model,但我在其 included_modules 中找不到 GlobalID::Identification

  1. GlobalID::Identification在哪里定义的?

  2. 我可以为我的 ActiveJobs 有效地使用任何 Mongoid::Document 吗?

指南中有错误。 GlobalID::Identification 已混入 ActiveRecord。如果你将 GlobalID::Identification 混合到你的 mongoid 文档中,它将自动工作,因为 GID 需要实例响应 id (returning uniq 标识符)和 class 响应find(传递 id 将 return 一条记录)。

要向遇到相同问题的任何人提供更多信息,只需将 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

在你的初始值设定项中加入类似这样的内容:

# 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