2015-01-07 18 views
8

Secondo il ActiveJobs guide, sezione 8, si dice:È Mongoid :: Document a GlobalID :: Identification for ActiveJobs?

Questo funziona con qualsiasi classe che mescola in GlobalID :: Identificazione, che di default è stato mescolato in classi modello attivo.

Mongoid::Document mescola ActiveModel::Model, ma non riesco a trovare nelle sue GlobalID::Identification included_modules.

  1. Dove è definito GlobalID::Identification?

  2. Posso utilizzare in modo efficace qualsiasi Mongoid::Document per le mie ActiveJob?

risposta

14

C'è un errore nelle guide. GlobalID::Identification è stato mescolato in ActiveRecord. Se mixai GlobalID::Identification nei tuoi documenti mongoi, funzionerà automaticamente poiché il GID richiede all'istanza di rispondere a id (restituendo l'identificatore uniq) e alla classe di rispondere a find (il superamento di un record id restituirà un record).

+0

Thank you very much! – Geoffroy

+8

Nel caso in cui aiuti qualcun altro, si "mescola" aggiungendo "include GlobalID :: Identification" nella parte superiore del modello. – SteveO7

6

Per fornire ulteriori informazioni a chiunque abbia lo stesso problema, è possibile farlo funzionare semplicemente aggiungendo GlobalID::Identification ai propri modelli.

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

realtà ho fatto che reopenning Mongoid::Document:

module Mongoid::Document 
    include GlobalID::Identification 
end 

Tuttavia, ho alcuni errori davvero strano a volte, con ActiveJob che non sapeva come serializzare i miei modelli. Ho cercato di eseguire il debug di esso, ma ogni volta che sono entrato in ActiveJob codice che ho avuto:

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

Ma ActiveJob::Arguments.serialize_argument non ha funzionato come previsto.

La soluzione è anche la riapertura Mongoid::Relations::Proxy:

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

È possibile riprodurre il bug 'SerializationError'? – bcd

+0

Ho già provato con una semplice applicazione ma non ha funzionato. Sto riscontrando questo problema in un'applicazione complessa ma non ho trovato alcuna ragione per cui questo errore si verifichi. Nel motore con questo codice, funziona bene, ma quando lo uso all'interno di un'app Rails, posso vedere che i miei modelli hanno 'GlobalID :: Identification' ma alcuni di essi non riescono a serializzare correttamente – Geoffroy

+4

Ho combattuto con questo per un mentre, e quello che ho visto è stato che un oggetto estratto da un'associazione appartiene all'oggetto non riportava come oggetto 'GlobalID :: Identification'. La mia correzione includeva anche 'GlobalID :: Identification' in' Mongoid :: Relations :: Proxy'. Credo che sia collegato all'uso di marshalable da parte dei mongoi, ma non ne sono del tutto sicuro. –

6

qualcosa di simile Mettete nel vostro 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