Ruby Time.zone.now и учет точности базы данных

в for obj in myList:, на каждой итерации obj является (неглубокой) копией элемента в myList. Таким образом, изменение на obj ничего не делает для элементов myList.

Это отличается от Perl for my $obj (@myList) {}

2
задан Ryan 5 March 2019 в 02:34
поделиться

2 ответа

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

Вы можете видеть, что представление .to_f Времени изменяется мгновенно:

irb(main):011:0> 2.times.map { Time.now.to_f }
=> [1551755487.5737898, 1551755487.573792]

Эта разница обычно не видна при использовании .to_i, поскольку она округляется до ближайшей секунды.

Вы можете использовать Timecop , как упоминает другой ответ, чтобы обойти это:

irb(main):013:0> Timecop.freeze { 2.times.map { Time.now.to_f } }
=> [1551755580.12368, 1551755580.12368]
0
ответ дан max pleaner 5 March 2019 в 02:34
поделиться

Я бы предложил использовать [Timecop] [1] для такого рода испытаний. Я также добавил бы, что не рекомендуется вручную прикасаться к отметке времени, поэтому я даже не совсем уверен, что вы проверяете. Похоже, вы не доверяете меткам времени. Но если вы должны, здесь:

Timecop.freeze
tmp_time = Time.zone.now
u = User.find(1)
u.updated_at = tmp_time
u.save!
u.reload

#your tests should pass now

Если они этого не делают, [см. Этот открытый вопрос по основным рельсам] [2]. Если это связано с вашей проблемой, Timecop должен предотвратить это. Но если этого не произойдет, то поздравляю, вы нашли основной случай рельсов.

0
ответ дан lacostenycoder 5 March 2019 в 02:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: