2013-12-17 12 views
18

Tài liệu đề cập đến bốn loại loại trường liên quan đến thời gian (http://mongoid.org/en/mongoid/docs/documents.html#fields). Trong các cơ sở dữ liệu khác, tôi có thể thấy các trường này sẽ là các kiểu khác nhau trong cơ sở dữ liệu như thế nào nhưng đối với MongoDB, chúng không phải là tất cả các kiểu Date? Đây có phải là sự nhất quán với ActiveRecord không?Trong Mongoid, có bất kỳ sự khác biệt nào trong các kiểu trường Ngày, Thời gian, Ngày giờ và Thời gian không?

Trả lời

10

Có hầu như không có sự khác biệt giữa chúng, tất cả chúng đều bao gồm kiểu Thời gian. Bạn có thể thay đổi DateTime, Date hoặc TimeWithZone để nhận các thể hiện của các kiểu này sau khi unserializing từ mongo.

Mongoid mở rộng lớp này để thêm các phương pháp demongoize/mongoize cho ràng buộc dữ liệu. Vì vậy, sự khác biệt duy nhất là trong thực hiện.

Vì vậy, Thời gian thực hiện

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 

ngày thi

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 

Bạn có thể kiểm tra implemetations khác

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

Chỉ là một cảnh báo: Tôi đã quan sát thấy một lỗi lạ trong các thử nghiệm rspec, trong đó các xác nhận trên các trường DateTime đôi khi sẽ thất bại do sự khác biệt mili giây. Tôi không có vấn đề này với các loại thời gian hoặc khi tải lại một cách có hệ thống một đối tượng trước khi xác nhận. –

+0

Câu trả lời này không đúng trong Mongoid 6.2. Kiểu dữ liệu 'Time' của Mongoid phục vụ cho việc lưu trữ' ActiveSupport :: TimeWithZone', trong khi 'DateTime' là một Ruby' DateTime' thuần túy. Và có sự khác biệt quan trọng giữa hai điều này. – skalee

Các vấn đề liên quan