Mongoid :: Document是GlobalID :: GlobalJobs的标识吗?

时间:2015-01-07 13:48:59

标签: ruby-on-rails ruby mongoid activemodel rails-activejob

根据ActiveJobs guide第8节,它说:

  

这适用于在GlobalID :: Identification中混合的任何类,   默认情况下已混合到Active Model类中。

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

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

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

3 个答案:

答案 0 :(得分:15)

指南中有一个错误。 GlobalID::Identification混合了ActiveRecord。如果您将GlobalID::Identification混合到您的mongoid文档中,它将自动工作,因为GID要求实例响应id(返回uniq标识符)和类以响应find(传递{ {1}}将返回记录)。

答案 1 :(得分:8)

在初始化程序中输入这样的内容:

# 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

答案 2 :(得分:6)

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