Я просто потратил значительное количество времени, пытаясь решить эту проблему, и хотя я ее исправил (вроде как), я далеко не понимаю, что происходит.
Возьмите монгоидную модель:
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
.