2015-01-07 5 views
8

Nach dem ActiveJobs guide Abschnitt 8 heißt es:Ist Mongoid :: Document eine GlobalID :: Identifikation für ActiveJobs?

Dies funktioniert mit jeder Klasse, die in GlobalID :: Identification mischt, die standardmäßig hat in Active Modellklassen gemischt worden.

Mongoid::Document mischt ActiveModel::Model, aber ich kann nicht GlobalID::Identification in seiner included_modules finden.

  1. Wo ist GlobalID::Identification definiert?

  2. Kann ich effektiv Mongoid::Document für meine ActiveJobs verwenden?

Antwort

14

Es gibt einen Fehler in den Anleitungen. GlobalID::Identification wurde in gemischt. Wenn Sie GlobalID::Identification in Ihre Mongoid-Dokumente mixen, wird es automatisch funktionieren, da GID erfordert, dass die Instanz auf id antwortet (die uniq-Kennung zurückgibt) und die Klasse auf find antwortet (eine id gibt einen Datensatz zurück).

+0

Vielen Dank! – Geoffroy

+8

Falls es jemand anderem hilft, "mixen" Sie, indem Sie "include GlobalID :: Identification" an die Spitze Ihres Modells hinzufügen. – SteveO7

6

Um mehr Informationen für alle Personen mit dem gleichen Problem zur Verfügung zu stellen, können Sie einfach GlobalID::Identification zu Ihren Modellen hinzufügen.

class User 
    include Mongoid::Document 
    include GlobalID::Identification 
end 

habe ich eigentlich getan, dass Mongoid::Document von reopenning:

module Mongoid::Document 
    include GlobalID::Identification 
end 

Allerdings habe ich manchmal ein paar wirklich seltsame Fehler haben, mit ActiveJob, die nicht wissen, wie meine Modelle serialisieren. Ich habe versucht, es zu debuggen, aber wenn ich in ActiveJob Code kam ich hatte:

pry> User.is_a? GlobalID::Identification 
=> true 

Aber ActiveJob::Arguments.serialize_argument nicht wie erwartet.

Die Abhilfe ist auch Mongoid::Relations::Proxy wieder zu öffnen:

class Mongoid::Relations::Proxy 
    include GlobalID::Identification 
end 
+0

Können Sie den Fehler "SerializationError" reproduzieren? – bcd

+0

Ich habe es bereits mit einer einfachen Anwendung versucht, aber es hat nicht funktioniert. Ich habe dieses Problem in einer komplexen Anwendung, aber ich habe keinen Grund für diesen Fehler gefunden. In der Engine mit diesem Code funktioniert es gut, aber wenn ich es in einer Rails App verwende, kann ich sehen, dass meine Modelle 'GlobalID :: Identification' haben, aber einige von ihnen nicht richtig serialisieren – Geoffroy

+4

Ich kämpfte mit diesem für eine while und was ich gesehen habe, war, dass ein objekt, das von einer assignes_to-verbindung abgezogen wurde, nicht als ein 'GlobalID :: Identification'-objekt gemeldet wurde. Meine Lösung war, 'GlobalID :: Identification' in' Mongoid :: Relations :: Proxy' einzubeziehen. Ich glaube, es hängt mit der Verwendung von Marshalable zusammen, aber ich bin mir nicht ganz sicher. –

6

Setzen Sie so etwas in Ihrer initializer:

# 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