2

特定の日時にデータベース内のレコードを自動的に変更する必要があります。

例: 日付と時刻が 01/12/2012 17:15:00 の場合、一部のレコードを自動的に 1 に設定したいのですが、これに対する解決策はありますか?

(Rails 3.2.6 を使用しています)

更新 30.11.12 - 13:06

本当の問題は、データベースに日時レコードがあり、このレコードの日時が今日の日時を超えている場合、別のレコードを 1 に設定したいということですif。何か、コントローラーのどこかに?

4

3 に答える 3

4

ここでいくつかの可能なオプションを見ることができます。それはあなたの仮定/制約に依存します。

考えられる仮定 (実装の難易度が高い順):

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、実行する必要がある実際の時間を計算することもできます。

お役に立てれば。

于 2012-11-30T12:35:21.973 に答える
0

Linuxサーバーでcronジョブを使用し、スクリプトを実行する時間を設定します

于 2012-11-30T12:12:07.137 に答える
0

いつでも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
于 2012-11-30T11:12:20.773 に答える