0

フォークしたhttps://github.com/Bramanga/mongo_mapper_acts_as_versioned gem を使用して、mongomapper モデルにバージョン管理を設定しようとしています。ただし、Finding モデルを保存しようとするたびに、Time タイプで保存しようとすると失敗します (MongoDB は日付ではなく utc 時間のみをサポートするため、これを使用する必要があります)。

モデル:

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 pry(メイン)> 検索 = Client.first.findings.build

=> <#Finding _id: BSON::ObjectId('4fc67c8f4e484f267c000002'), client_id: BSON::ObjectId('4f7119884e484f25bd005ee8'), custom_fields: {}, legacy_attachments: [], タグ: []>

[2] pry(メイン) > 発見.保存

=>真

[3] pry(メイン)> find.found_date = "12/24/2012"

=>「2012/12/24」

[4] 詮索(メイン) > 発見.保存

BSON::InvalidDocument: ActiveSupport::TimeWithZone は現在サポートされていません。代わりに UTC Time インスタンスを使用してください。from /home/bramanga/.rvm/gems/ruby-1.9.2-p290@actionlog/gems/bson-1.6.2/lib/bson/bson_c.rb:24:in `serialize'

これを修正する方法がわかりません。多分私はそれを間違っているだけです。何か案は?

4

1 に答える 1

2

レポをフォークした後、私自身の問題を修正しました。私の解決策はこちらです。

この問題は、mongodbのサポートされている日付タイプに関連しています。UTCタイムスタンプ形式のみをサポートします。データベースに永続化する前にescape_mongo、安全な型に変換する独自のメソッドを追加しました。timestamp

def escape_mongo(obj)       
    obj.is_a?(Date) || obj.is_a?(Time) ? Date.to_mongo(obj) : obj   
end
于 2012-08-28T21:41:40.607 に答える