В документации упоминаются четыре типа типов полей, связанных с временем (http://mongoid.org/en/mongoid/docs/documents.html#fields). В других базах данных я вижу, как эти поля будут разностными типами в базе данных, но для MongoDB все они не будут типами даты? Это просто для согласованности с ActiveRecord?
В Mongoid существуют ли различия в типах полей Date, Time, DateTime и TimeWithZone?
Ответ 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