0

我試圖在我的mongomapper模型上使用我分叉的https://github.com/Bramanga/mongo_mapper_acts_as_versioned gem來設置版本控制。但是,每當我嘗試保存我的查找模型時,如果我嘗試使用時間類型(我必須使用它,因爲MongoDB只支持utc時間而不是日期)保存它,它將失敗。保存時間類型時mongo_mapper_acts_as_versioned失敗

型號:

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 

端子輸出:

加載開發環境(滑軌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 = 「2012年12月24日」

=>「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'連載」

我我不知道如何解決這個問題。也許我只是做錯了。有任何想法嗎?

+0

你行代碼爲我工作,如果我註釋掉「插件」和「多」行,所以我真的避風港沒有測試過MongoMapper :: Acts :: Versioned是否與你的問題有關。你可以發佈你的Gemfile嗎?猜測你正在使用的寶石和插件是困難和耗時的。 –

回答

2

修復了回購之後我自己的問題。我的解決方案是here

該問題與mongodb支持的日期類型有關。它僅支持UTC時間戳格式。我說我自己的escape_mongo方法轉換到安全timestamp類型被持久化到數據庫之前:

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