Вы не говорите нам, что тип данных ваше starts_at
поле, но шансы очень хорошо, что вы практически никогда не найти момент, где starts_at
равно Time.now
так
if starts_at == Time.now
обычно терпят неудачу.
Time.now
имеет степень детализации за пределами секунды. Это от Time class documentation:
Все время может иметь долю. Имейте в виду этот факт при сравнении времени с друг с другом - времена, которые, по-видимому, равны, если отображаемые могут отличаться от .
и от Time#to_f
documentation:
t = Time.now
"%10.5f" % t.to_f #=> "1270968744.77658"
t.to_i #=> 1270968744
Если вы используете DateTime или Time поле это будет очень трудно соответствовать этому микросекунду. Вместо этого вам нужно сменить код с ==
на <=
, который будет срабатывать всякий раз, когда start_time
меньше или равен Time.now
, при условии, что это совместимое поле, конечно.
Изменение:
if starts_at == Time.now
к:
if starts_at <= Time.now
и он должен работать лучше.
В качестве альтернативы, вы можете сделать свое starts_at
поля быть целым или Fixnum, а затем измените значения в нем целые числа, а затем сравнить с использованием Time#to_i
, что приводит только за секунды, а не суб-секунду:
[1] (pry) main: 0> foo = Time.now
2017-01-25 15:21:08 -0700
[2] (pry) main: 0> foo.to_f
1485382868.014835
[3] (pry) main: 0> foo.to_i
1485382868
Но вы по-прежнему хотите использовать <=
вместо ==
.
Вот что-то обдумывать:
foo = Time.now
bar = Time.now
foo # => 2017-01-25 15:25:42 -0700
bar # => 2017-01-25 15:25:42 -0700
foo.to_f # => 1485383142.157932
bar.to_f # => 1485383142.1579342
foo.to_i # => 1485383142
bar.to_i # => 1485383142
Даже на полной скорости, Ruby до сих пор возвращает разное время для foo
VS. bar
, и в этот промежуток ваш код будет не хватать обжиг. to_i
дает вам односекундную детализацию, но этого все еще недостаточно, поэтому необходимо, чтобы <=
.
Добро пожаловать в переполнение стека. Пожалуйста, прочитайте «[ask]» и связанные страницы. Вы должны помочь нам помочь вам. Ваш вопрос не определен. Что вы пробовали? Покажите нам минимальный код, чтобы продемонстрировать его. В настоящее время нам придется определять вещи в широких терминах, которые оставляют слишком много возможностей для интерпретации. Представьте, что кто-то вошел в комнату с вашим вопросом на листе бумаги, вручил его вам и ушел. Что вам нужно увидеть? Какие вопросы вы могли бы задать им? Тогда поставьте это на свой вопрос. –
@theTinMan Спасибо, я понимаю, что мой вопрос действительно неясен, надеюсь, что этот кусок кода поможет – SumLare