Rails 3.1, Ruby 1.9.2, Mongoid 2.3.3 — полтергейст находится в моем datetimez

#ruby-on-rails #ruby #mongoid

#ruby-on-rails #ruby #mongoid

Вопрос:

Я только что потратил значительное количество времени, пытаясь исправить эту проблему, и хотя я ее исправил (вроде) Я даже близко не понимаю, что происходит.

Возьмем модель Mongoid:

 class Game
  include Mongoid::Document
  include Mongoid::Timestamps

  field :start, type: DateTime
  index :start

  def process(attrs = nil, role = :default, guard_protected_attributes = true)
    if attrs.keys.include?('start(1i)')
      now = DateTime.now
      year  = attrs.delete('start(1i)').to_i || now.year
      month = attrs.delete('start(2i)').to_i || now.month
      day   = attrs.delete('start(3i)').to_i || now.day
      hour  = attrs.delete('start(4i)').to_i || now.hour
      min   = attrs.delete('start(5i)').to_i || now.minute
      sec   = attrs.delete('start(6i)').to_i || 0 # seconds
      zone  = attrs.delete('start(7i)').to_i || 0 # UTC

      # I'm not sure what is happening here, but we need to adjust the hour
      # otherwise Rails/Mongoid will mangle the time...
      start = DateTime.new(year, month, day, hour, min, sec, zone)
      # First we set the time and self.start will be wrong by 6 hours (my timezone)
      self.start = start
      # We do this and the time will change by several hours!!!
      self.start -= 0.seconds
      # Can't make a simple substraction as we'll get a Rational? The WTFs just keep piling up...
      diff = (self.start.to_i - start.to_i).seconds
      self.start -= diff
      self.start -= diff # Yeah, twice?
    end

    super(attrs, role, guard_protected_attributes)
  end
end
  

Почему process метод? Ну, я не могу позволить, чтобы start атрибут обрабатывался Mongoid::MultiParameterAttributes , поскольку «что-то» «исправит» это, настроив его с использованием моего местного часового пояса (не выяснил, какой блестящий код это делает).

В этом коде start переменная всегда будет иметь правильное время, но, как вы видели, self.start нужно бить молотком, пока время тоже не будет правильным.

Странно? Чувак, не заводи меня. Это связано с многопараметрическими атрибутами Rails, которые позволяют мне использовать несколько select тегов для установки даты / времени ( start(1i) материала).

Time.zone это UTC, поэтому я не знаю, почему он использует мой местный часовой пояс для искажения времени.

Но самое странное, почему я должен вносить так много изменений…

Я не ожидаю найти реальное решение в ближайшее время, но я хотел бы знать ваши мысли.

PS: Ого, так и не позволил мне добавить poltergeist тег.

Ответ №1:

Оказывается, мне просто пришлось:

 Mongoid::Config.use_utc = true
Mongoid::Config.use_activesupport_time_zone = true
  

Это все еще не объясняет странное поведение do. Или, может быть, это так, и я этого не вижу 🙂

Комментарии:

1. use_utc должен = false согласно github.com/mongoid/mongoid/issues/1475 amp;amp; github.com/mongoid/mongoid/issues/878

2. также поле должно быть объектом «Time», а не «DateTime», чтобы оно работало должным образом