ここでいくつかの可能なオプションを見ることができます。それはあなたの仮定/制約に依存します。
考えられる仮定 (実装の難易度が高い順):
1) データはデータベース内で正確である必要はありませんが、次に誰かがデータを調べたときに、それに応じて修正します 2) データベース内でデータが正確である必要はありませんが、たとえば定義可能な時間内に-interval 3) データベース内のデータは常に正確である必要があります
これらについて詳しく説明します
次回誰かがデータを見ると、データは正しく表示されます
これは実際にはかなり簡単です。表示するデータを取得するときは、特定の条件/時間が経過したかどうかを確認し、それに応じてフラグを設定します。
ユーザーにとっては、フラグがいつ正しく設定されたかは実際には関係ありませんが、ユーザーがデータを見るたびに、フラグは正しく設定されます。
データは、指定された時間間隔内で正しくなります
簡単なケースとしては、1 時間ごと、30 分ごと、1 日 1 回チェックし、変更が必要な項目の状態を設定または修正します。
これを達成するには、いつでもcronジョブまたはgemを使用します
これは非常に単純なアプローチであり、許容できる/指定された間隔でデータが正しいことを保証します (もちろん、問題にそのような間隔がある場合)。
データは正しい時間に設定する必要があります
ここでは、特定の時間に状態を変更する必要があるアイテムごとに、以前と同じオプションを使用してタスクをスケジュールする 2 つのオプションがあります。これは機能しますが、cron が多くの 1 回限りのジョブをスケジュールするための最適なソリューションであるかどうかは完全にはわかりません。
または、非常にクリーンな解決策は、DelayedJobのような gem を使用することです。この gem は主に、処理にもう少し時間が必要なタスクなど、タスクをバックグラウンドにオフロードするために使用されます。ただし、近い将来、非常に特定の時間にタスクを実行するためにも使用できます。
def change_flag_when_needed
# change the flag
end
# 5.minutes.from_now will be evaluated when change_flag_when_needed is called
handle_asynchronously :in_the_future, :run_at => Proc.new { 5.minutes.from_now }
を呼び出すときはいつでもchange_flag_when_needed
、指定されたブロックが評価されます。これには現在 が含まれていますが5.minutes.from_now
、実行する必要がある実際の時間を計算することもできます。
お役に立てれば。