我在架子的帮助下在红宝石上写了一个电报机器人。我的问题是什么可以帮助我完成这项任务。当我的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
如果此事件已准备就绪,我需要一直检查并在此之后发送消息。
答案 0 :(得分:0)
您没有告诉我们您的starts_at
字段的数据类型是什么,但是几乎永远不会发现starts_at
等于Time.now
所以< / p>
if starts_at == Time.now
通常会失败。
Time.now
的粒度远远超过一秒。这来自Time class 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
与bar
返回不同的时间,并且在该差距中,您的代码将错过触发。 to_i
为您提供了一秒钟的粒度,但仍然不够,因此需要<=
。