Rails 3.1, Ruby 1.9.2, Mongoid 2.3.3 - полтергейст у меня в datetimez - PullRequest
1 голос
/ 05 ноября 2011

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

Возьмите монгоидную модель:

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 нужно разбивать молотком до тех пор, пока время тоже не будет правильным.

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

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

Но самое странное - зачем мне так много корректировок ...

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

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

1 Ответ

0 голосов
/ 09 ноября 2011

Оказывается, мне просто нужно было:

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

Это все еще не объясняет странного поведения. А может, так и есть, а я этого не вижу :)

...