2017-01-25 11 views
0

Я написал телеграмму бота на рубине с помощью стойки. Мои вопросы - вот что может помочь мне выполнить эту задачу. Мне нужно, чтобы бот отправил одно сообщение, когда поле start_at моего объекта activerecord будет равно сейчас. В основном мне нужно постоянно выполнять эту задачу, чтобы она отслеживала мою базу данных и отправляла это сообщение. Я подумал о чем-то вроде delayed_job, не знаю, как он может помочь мне достичь моей цели.Задание для телеграммы бота

мне нужно, чтобы закрыть событие в определенное время:

class Event < ActiveRecord::Base 
    def close 
    if starts_at == Time.now 
     send_message("Some farewell message") 
    end 
    end 
end 

мне нужно проверить все время, если это событие готово закрыть и отправить сообщение после этого.

+0

Добро пожаловать в переполнение стека. Пожалуйста, прочитайте «[ask]» и связанные страницы. Вы должны помочь нам помочь вам. Ваш вопрос не определен. Что вы пробовали? Покажите нам минимальный код, чтобы продемонстрировать его. В настоящее время нам придется определять вещи в широких терминах, которые оставляют слишком много возможностей для интерпретации. Представьте, что кто-то вошел в комнату с вашим вопросом на листе бумаги, вручил его вам и ушел. Что вам нужно увидеть? Какие вопросы вы могли бы задать им? Тогда поставьте это на свой вопрос. –

+0

@theTinMan Спасибо, я понимаю, что мой вопрос действительно неясен, надеюсь, что этот кусок кода поможет – SumLare

ответ

0

Вы не говорите нам, что тип данных ваше 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 дает вам односекундную детализацию, но этого все еще недостаточно, поэтому необходимо, чтобы <=.