Подтвердить что ты не робот

В Mongoid существуют ли различия в типах полей Date, Time, DateTime и TimeWithZone?

В документации упоминаются четыре типа типов полей, связанных с временем (http://mongoid.org/en/mongoid/docs/documents.html#fields). В других базах данных я вижу, как эти поля будут разностными типами в базе данных, но для MongoDB все они не будут типами даты? Это просто для согласованности с ActiveRecord?

4b9b3361

Ответ 1

Между ними практически нет разницы, все они обматывают тип времени. Вы можете изменить DateTime, Date или TimeWithZone, чтобы получить экземпляры этих типов после unserializing из mongo.

Mongoid расширяет этот класс, добавляя методы demongoize/mongoize для привязки данных. Поэтому единственная разница в реализации.

Итак, реализация времени

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

Реализация даты

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

Вы можете проверить другие возможности

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