0

Я пытаюсь настроить версию на моей модели mongomapper, используя драгоценный камень https://github.com/Bramanga/mongo_mapper_acts_as_versioned, который я разветвил. Однако всякий раз, когда я пытаюсь сохранить мою модель поиска, она терпит неудачу, если я попытаюсь сохранить ее с типом времени (который я должен использовать, поскольку MongoDB поддерживает только время utc, а не даты).mongo_mapper_acts_as_versioned failing при сохранении типа времени

Модель:

class Finding 
    require 'carrierwave/orm/mongomapper' 
    include MongoMapper::Document 
    ensure_index 'finding.document' 
    plugin MongoMapper::Acts::Versioned 

    attr_accessible :found_date, :target_date, :abated_date 

    key    :found_date,   Time 
    key    :target_date,   Time 
    key    :abated_date,   Time 

    belongs_to  :client 
    many   :uploads, :dependent => :destroy 
    many   :documents, :dependent => :destroy 

    timestamps! 

    def found_date=(date) 
    if date.present? 
     self[:found_date] = Chronic.parse(date).utc.beginning_of_day 
    else 
     self[:found_date] = nil 
    end 
    end 

    def target_date=(date) 
    if date.present? 
     self[:target_date] = Chronic.parse(date).utc.beginning_of_day 
    else 
     self[:target_date] = nil 
    end 
    end 

    def abated_date=(date) 
    if date.present? 
     self[:abated_date] = Chronic.parse(date).utc.beginning_of_day 
    else 
     self[:abated_date] = nil 
    end 
    end 
end 

терминальный выход:

среда разработки Загрузка (Rails 3.0.10)

1 монтировку (основной)> найти = Client.first.findings.build

=> < #Finding _ID: BSON :: ObjectId ('4fc67c8f4e484f267c000002'), client_id: BSON :: ObjectId ('4f7119884e484f25bd005ee8'), custom_fields: {}, legacy_attachments: [], теги: []>

[2] (монтировку основной)> finding.save

=> истинная

[3] монтировку (основной)> finding.found_date = "12/24/2012"

=> «12/24/2012 "

[4] монтировку (основной)> finding.save

BSON :: InvalidDocument: ActiveSupport :: TimeWithZone в настоящее время не поддерживается; вместо этого используйте экземпляр времени UTC. из /home/bramanga/.rvm/gems/[email protected]/gems/bson-1.6.2/lib/bson/bson_c.rb:24:in `сериализации»

I Не знаю, как это исправить. Может быть, я просто делаю это неправильно. Есть идеи?

+0

Ваши строки кода работают для меня, если я закомментировать «плагин» и «много» линий, так что я действительно убежище 't проверено, связано ли MongoMapper :: Acts :: Versioned с вашей проблемой. Можете ли вы опубликовать свой Gemfile? Трудно и много времени, чтобы догадаться о драгоценных камнях и плагинах, которые вы используете. –

ответ

2

Исправлена ​​ошибка, возникшая после разворачивания репо. Мое решение - here.

Эта проблема связана с типами поддерживаемых дат mongodb. Он поддерживает только формат timestamp UTC. Я добавил свой собственный escape_mongo метод для преобразования в безопасное timestamp типа перед тем, сохраняется в базе данных:

def escape_mongo(obj)  
    obj.is_a?(Date) || obj.is_a?(Time) ? Date.to_mongo(obj) : obj 
end