в for obj in myList:
, на каждой итерации obj
является (неглубокой) копией элемента в myList
. Таким образом, изменение на obj
ничего не делает для элементов myList
.
Это отличается от Perl for my $obj (@myList) {}
Проблема, скорее всего, заключается не в точности в базе данных, а в том, что между определением 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]
Я бы предложил использовать [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 должен предотвратить это. Но если этого не произойдет, то поздравляю, вы нашли основной случай рельсов.