电报机器人的任务

时间:2017-01-25 21:29:46

标签: ruby activerecord rack telegram-bot

我在架子的帮助下在红宝石上写了一个电报机器人。我的问题是什么可以帮助我完成这项任务。当我的activerecord对象的starts_at字段现在等于我时,我需要bot发送一条消息。基本上我需要一直执行此任务,以便监视我的数据库并发送此消息。我想过像delayed_job这样的东西,不知道它是如何帮助我实现目标的。

我需要在特定时间关闭活动:

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

如果此事件已准备就绪,我需要一直检查并在此之后发送消息。

1 个答案:

答案 0 :(得分:0)

您没有告诉我们您的starts_at字段的数据类型是什么,但是几乎永远不会发现starts_at等于Time.now所以< / p>

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仍会为foobar返回不同的时间,并且在该差距中,您的代码将错过触发。 to_i为您提供了一秒钟的粒度,但仍然不够,因此需要<=