Как правильно сохранить часовой пояс с Ruby и MongoId? - PullRequest
9 голосов
/ 17 октября 2011

Пожалуйста, извините, если это немного нубский вопрос:

У меня есть приложение, в котором пользователи могут устанавливать свои часовые пояса в своем профиле.

Когда кто-то добавляет состав (специальную терминологию приложения), я делаю следующее:

time = ActiveSupport::TimeZone.new(user.timezone).parse(
  "Wednesday, 26 October, 2011 13:30:00"
)

# This outputs: 2011-10-26 13:30:00 +0200 - valid according to the user selected TZ

Затем я сохраняю состав:

Lineup.create({
   :date => time.gmtime,
   :uid  => user._id,
   :pid  => product._id
})

Это должно (теоретически) сохранить дату как gmtime, но при просмотре записи я получаю следующее:

{
  "_id": ObjectId("4e9c6613e673454f93000002"),
  "date": "Wed, 26 Oct 2011 13: 30: 00 +0200",
  "uid": "4e9b81f6e673454c8a000001",
  "pid": "4e9c6613e673454f93000001",
  "created_at": "Mon, 17 Oct 2011 19: 29: 55 +0200"
}

Как видите, поле даты неверно - оно по-прежнему поддерживает часовой пояс пользователя, оно должно быть по Гринвичу, а не по часовому поясу.

Если я вывожу time.gmtime, я получаю правильное время (которое следует сохранить):

2011-10-26 11:30:00 UTC (correct)

Есть идеи, как сохранить дату по Гринвичу, чтобы она действительно сохраняла дату по Гринвичу?

1 Ответ

11 голосов
/ 24 октября 2011

Похоже, вам нужно указать тип поля вашего атрибута даты. Я бы использовал поле Time, если вы хотите, чтобы mongoid правильно обрабатывал зоны.

class Lineup
  include Mongoid::Document
  field :date, type: Time
end

Возможно, вы также захотите установить следующее в config / mongoid.yml

defaults: &defaults
  use_utc: false
  use_activesupport_time_zone: true

Это звучит нелогично, но это текущий способ заставить монгоид использовать UTC в качестве часового пояса по умолчанию.

Наконец, взгляните на камень mongoid-metastamp . Это обеспечит вам гораздо лучшую поддержку запросов в нескольких часовых поясах, при этом бесперебойно работая как собственное поле времени.

...