#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», чтобы оно работало должным образом