2017-01-25 13 views
0

私は、ラックの助けを借りてルビーの電報ボットを書いた。私の質問は、私がこの仕事をするのに役立つものです。私のactiverecordオブジェクトのstarts_atフィールドが今のと同じになるときにボットが1つのメッセージを送信する必要があります。基本的には、このタスクを常に実行してデータベースを監視し、このメッセージを送信する必要があります。私はdelayed_jobのようなものを考えましたが、それが私の目標を達成するのにどのように役立つのかわかりません。電報ボットの仕事

は、私は特定の時間にイベントをクローズする必要があります。

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

が、私は、このイベントは終了し、この後にメッセージを送信する準備ができている場合は、すべての時間をチェックする必要があります。あなたのstarts_atフィールドがあるデータ型が、starts_atはそう

if starts_at == Time.now 

は、通常は失敗します Time.nowに等しいオッズは、あなたがインスタントを見つけることはほとんどないだろうということは本当に良いです何を教えていない

+0

ようこそスタックオーバーフロー。 「[ask]」とリンク先のページをお読みください。あなたのお手伝いをする必要があります。あなたの質問はよく定義されていません。何を試しましたか?それを実証するための最小限のコードを教えてください。現在、私たちは広い意味で解釈しなければならないものを定義する必要があります。誰かがあなたの質問で部屋に入って紙の上を歩いてそれをあなたに渡して歩き回ったとします。あなたは何を見る必要がありますか?どのような質問をしてもらえますか?それをあなたの質問に入れてください。 –

+0

@theTinManありがとう、私は私の質問が本当に不明であることを理解しています、コードのこの塊が助けてくれることを願って – SumLare

答えて

0

Time.nowは1秒をはるかに超える粒度を持っています。これは、Time class documentationから:

すべての時間は分数を持つことがあります。 と時刻を比較するとき、この事実に注意してください - 表示されたときに明らかに等しい時間は、比較すると となります。

Time#to_f documentationから:

t = Time.now 
"%10.5f" % t.to_f #=> "1270968744.77658" 
t.to_i    #=> 1270968744 

あなたはそのマイクロ秒と一致するのは非常に難しいことになるだろうのDateTimeまたはTimeフィールドを使用している場合。代わりにから<=を使用するコードを変更する必要があります。これはstart_timeTime.now以下の場合にトリガーされます。互換性のあるフィールドであると仮定します。

変更:

if starts_at == Time.now 

へ:

if starts_at <= Time.now 

、それがより良い動作するはずです。

[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 

代わりに、あなたはあなたのstarts_atフィールドが整数またはFIXNUMなり、その後、その後、ないサブ秒、わずか数秒で結果Time#to_iを使用して比較し、整数にして値を変更することができます

でも、==の代わりに<=を使用します。ここで

は熟考する何か:

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は1秒単位の細かさを提供しますが、まだ十分ではないので、<=が必要です。

関連する問題