Date Times с Backbone, Rails 3.1 и MongoMapper - PullRequest
0 голосов
/ 11 февраля 2012

Я учусь использовать Backbone js с Rails и Mongo. Вот мои модели:

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

По какой-то причине время, которое я отправляю как startDate и endDate, уменьшилось при обновлении mongo, но я вижу, что магистраль правильно их проталкивает:

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}]})

Обратите внимание, что rails правильно получает мои параметры startDate и endDate как строки в формате ISO8601, но при вызове update задается время 00:00:00. Что я делаю не так?

1 Ответ

2 голосов
/ 12 февраля 2012

Вы теряете время суток, потому что используете Date, где вы имеете в виду Time. MongoMapper типовая документация в значительной степени говорит "прочитай исходники", так что мы сделаем это; если вы посмотрите на extensions/time.rb, вы увидите, что он работает с экземплярами Time, но если вы посмотрите на 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.

Попробуйте определить свой TimeEntry следующим образом:

class TimeEntry
  include MongoMapper::EmbeddedDocument

  belongs_to :task

  key :startDate, Time
  key :endDate, Time
end
...