特定の日時にデータベース内のレコードを自動的に変更する必要があります。
例: 日付と時刻が 01/12/2012 17:15:00 の場合、一部のレコードを自動的に 1 に設定したいのですが、これに対する解決策はありますか?
(Rails 3.2.6 を使用しています)
更新 30.11.12 - 13:06
本当の問題は、データベースに日時レコードがあり、このレコードの日時が今日の日時を超えている場合、別のレコードを 1 に設定したいということですif。何か、コントローラーのどこかに?
特定の日時にデータベース内のレコードを自動的に変更する必要があります。
例: 日付と時刻が 01/12/2012 17:15:00 の場合、一部のレコードを自動的に 1 に設定したいのですが、これに対する解決策はありますか?
(Rails 3.2.6 を使用しています)
更新 30.11.12 - 13:06
本当の問題は、データベースに日時レコードがあり、このレコードの日時が今日の日時を超えている場合、別のレコードを 1 に設定したいということですif。何か、コントローラーのどこかに?
ここでいくつかの可能なオプションを見ることができます。それはあなたの仮定/制約に依存します。
考えられる仮定 (実装の難易度が高い順):
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、実行する必要がある実際の時間を計算することもできます。
お役に立てれば。
Linuxサーバーでcronジョブを使用し、スクリプトを実行する時間を設定します
いつでもhttps://github.com/javan/wheneverを使用して、cron ジョブをセットアップできます
ファイルに簡単な構文が含まれているときはいつでもschedule.rb好きなときにタスクを実行できます
彼らのreadmeから:
every 3.hours do
runner "MyModel.some_process"
rake "my:rake:task"
command "/usr/bin/my_great_command"
end
every 1.day, :at => '4:30 am' do
runner "MyModel.task_to_run_at_four_thirty_in_the_morning"
end
every :hour do # Many shortcuts available: :hour, :day, :month, :year, :reboot
runner "SomeModel.ladeeda"
end
every :sunday, :at => '12pm' do # Use any day of the week or :weekend, :weekday
runner "Task.do_something_great"
end
every '0 0 27-31 * *' do
command "echo 'you can use raw cron syntax too'"
end
# run this task only on servers with the :app role in Capistrano
# see Capistrano roles section below
every :day, :at => '12:20am', :roles => [:app] do
rake "app_server:task"
end