2012-02-11 6 views
0

RailsとMongoでバックボーンjを使用する方法を学んでいます。ここに私のモデルは以下のとおりです。バックボーン、Rails 3.1、MongoMapperの日付時刻

class Task 
    include MongoMapper::Document 
    include ActionView::Helpers 

    many :time_entries 

    key :description, String 
    key :duration, Integer, :default => 0 
    timestamps! 
end 

class TimeEntry 
    include MongoMapper::EmbeddedDocument 

    belongs_to :task 

    key :startDate, Date 
    key :endDate, Date 
end 

いくつかの理由のmongoを更新するとき、私はたstartDateとendDateにとして送信日付時間が倍に下落しているが、私は背骨がそれらを推進している見ることができます正しく経由:レール

Started PUT "/tasks/4f357ece8af1b04a54000ef2" for 127.0.0.1 at 2012-02-11 12:25:19 -0500 
Processing by TasksController#update as JSON 
Parameters: {"description"=>"Task with time entry", "time_entries"=>[{"startDate"=>"2012-02-11T17:25:19.529Z"}], "created_at"=>"2012-02-10T20:32:14Z", "duration"=>0, "id"=>"4f357ece8af1b04a54000ef2", "updated_at"=>"2012-02-11T17:25:00Z", "task"=>{"description"=>"Task with time entry", "time_entries"=>[{"startDate"=>"2012-02-11T17:25:19.529Z"}], "created_at"=>"2012-02-10T20:32:14Z", "duration"=>0, "id"=>"4f357ece8af1b04a54000ef2", "updated_at"=>"2012-02-11T17:25:00Z", "action"=>"update", "controller"=>"tasks"}} 
MONGODB timetrack_development['tasks'].find({:_id=>BSON::ObjectId('4f357ece8af1b04a54000ef2')}).limit(-1) 
MONGODB timetrack_development['tasks'].update({:_id=>BSON::ObjectId('4f357ece8af1b04a54000ef2')}, {"_id"=>BSON::ObjectId('4f357ece8af1b04a54000ef2'), "description"=>"Task with time entry", "duration"=>0, "created_at"=>2012-02-10 20:32:14 UTC, "updated_at"=>2012-02-11 17:25:19 UTC, "time_entries"=>[{"_id"=>BSON::ObjectId('4f36a47f8af1b04a54000ff9'), "task_id"=>nil, "startDate"=>2012-02-11 00:00:00 UTC}]}) 

通知は私たstartDateとendDateに正しくのparamsのparamsでISO8601フォーマットされた文字列としてを得ているが、更新への呼び出しは00時間ピースを設定します。 00:00。私は間違って何をしていますか?

答えて

2

DateここではTimeを使用しているため、時間帯がなくなります。 MongoMapper types documentationは "ソースを読んでください"と言っているので、それをします。あなたはextensions/time.rbを見れば、あなたはそれが時間インスタンスで動作することがわかりますが、あなたはextensions/date.rbを見れば、あなたはそれがDateインスタンスで動作することがわかります:

def to_mongo(value) 
    #...  
    date = value.is_a?(::Date) || value.is_a?(::Time) ? value : ::Date.parse(value.to_s) 
    ::Time.utc(date.year, date.month, date.day) 
    #... 
end 

def from_mongo(value) 
    value.to_date if value.present? 
end 

だから、任意の時刻startDateまたはendDateにMongoDBに出入りする途中で消えてしまいます。

class TimeEntry 
    include MongoMapper::EmbeddedDocument 

    belongs_to :task 

    key :startDate, Time 
    key :endDate, Time 
end 

は、このようなあなたのTimeEntryを定義してください