2013-12-17 12 views

risposta

10

Non c'è quasi nessuna differenza tra di loro, tutti avvolgono il tipo Time. È possibile modificare DateTime, Date o TimeWithZone per ottenere istanze di questo tipo dopo aver annullato la serializzazione da mongo.

Mongoid estende questa classe per aggiungere metodi demongoize/mongoize per l'associazione dati. Quindi l'unica differenza è nell'implementazione.

Così i tempi di implementazione

def demongoize(object) 
    return nil if object.blank? 
    object = object.getlocal unless Mongoid::Config.use_utc? 
    if Mongoid::Config.use_activesupport_time_zone? 
    object = object.in_time_zone(Mongoid.time_zone) 
    end 
    object 
end 

def mongoize(object) 
    return nil if object.blank? 
    begin 
    time = object.__mongoize_time__ 
    if object.respond_to?(:sec_fraction) 
     ::Time.at(time.to_i, object.sec_fraction * 10**6).utc 
    elsif time.respond_to?(:subsec) 
     ::Time.at(time.to_i, time.subsec * 10**6).utc 
    else 
     ::Time.at(time.to_i, time.usec).utc 
    end 
    rescue ArgumentError 
    EPOCH 
    end 
end 

implementazione Data

def demongoize(object) 
    ::Date.new(object.year, object.month, object.day) if object 
end 


def mongoize(object) 
    unless object.blank? 
    begin 
     time = object.__mongoize_time__ 
     ::Time.utc(time.year, time.month, time.day) 
    rescue ArgumentError 
     EPOCH 
    end 
    end 
end 

È possibile controllare altri implemetations

https://github.com/mongoid/mongoid/blob/master/lib/mongoid/extensions/date.rb#L46 https://github.com/mongoid/mongoid/blob/master/lib/mongoid/extensions/date_time.rb#L49 https://github.com/mongoid/mongoid/blob/master/lib/mongoid/extensions/time.rb#L48 https://github.com/mongoid/mongoid/blob/master/lib/mongoid/extensions/time_with_zone.rb#L32

+0

Solo un avvertimento: ho notato uno strano bug nei test di rspec, dove le asserzioni sui campi DateTime a volte fallivano a causa di una differenza di millisecondo. Non ho questo problema con i tipi di tempo o quando si ricarica sistematicamente un oggetto prima dell'asserzione. –

+0

Questa risposta non è vera in Mongoid 6.2. Il tipo di dati 'Tempo' di Mongoid serve per la memorizzazione di' ActiveSupport :: TimeWithZone', mentre 'DateTime' è un puro Ruby' DateTime'. E ci sono differenze importanti tra questi due. – skalee

Problemi correlati