【问题标题】:Task for telegram bot电报机器人的任务
【发布时间】:2017-01-25 21:29:46
【问题描述】:

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

我需要在特定时间结束活动:

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

我需要一直检查此事件是否准备好关闭并在此之后发送消息。

【问题讨论】:

  • 欢迎来到 Stack Overflow。请阅读“How to Ask”和链接页面。您需要帮助我们帮助您。你的问题没有很好的定义。你试过什么?向我们展示演示它的最少代码。目前,我们必须用宽泛的术语来定义事物,这给解释留下了太多的空间。想象一下有人走进一个房间,把你的问题写在一张纸上,递给你然后走开了。你需要看什么?你会问他们什么问题?然后将其放入您的问题中。
  • @theTinMan 谢谢,我明白我的问题很不清楚,希望这段代码对您有所帮助

标签: ruby activerecord rack telegram-bot


【解决方案1】:

您没有告诉我们您的 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 字段,则很难匹配该微秒。相反,您需要将代码从使用 == 更改为 &lt;=,这将在 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

但您仍想使用&lt;= 而不是==

这里有一些需要考虑的事情:

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 为您提供一秒的粒度,但这仍然不够,因此需要 &lt;=

【讨论】:

    猜你喜欢
    • 2017-08-18
    • 1970-01-01
    • 2018-07-22
    • 2020-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-02
    • 2020-08-20
    相关资源
    最近更新 更多