2016-11-03 1 views
0

各ユーザーの情報にいくつかのメンテナンスを実行したいが、それはユーザーのタイムゾーンごとに真夜中頃にしか発生しないようにしたい。ユーザーの表には、デフォルトでEasternになるtime_zone列があります。レールでユーザのタイムゾーンごとに特定の時刻にレーキタスクを実行するにはどうすればよいですか?

task update_user_stuff: :environment do 
    users = [] 
    User.all.each do |user| 
    b = Time.now - 29.minutes 
    e = Time.now + 30.minutes 
    if (b..e).cover?(Time.now.in_time_zone(user.time_zone).beginning_of_day) 
     users << user 
    end 
    end  
    unless users.blank? 
    users.each do |user| 
     # user maintenance here 
    end 
    end 
end 

コードが完了するまでに約4秒を取って、20人のユーザーのテストデータベースと私のテストで動作するように思われること:

これまでのところ私はすべての時間を実行するように設定し、次のrakeタスクを持っています。私の懸念は、数千人のユーザーがいるプロダクションサーバーでは効率が悪く、タイムウィンドウを手動で設定する(4-5行目)に頼ると問題が発生することです。

このタスクを作成するには、どのような方法が良いですか?

さらに明確にするために編集:私はこのタスクを定期的に実行する方法を知っています。私は仕事そのものがより良く書けるかどうか尋ねています。

+0

[いつでも](https://github.com/javan/whenever)のような宝石を使用してください。ハッピー? – MarsAtomic

+0

上記のコードは、cronジョブによって実行されます。 – Preacher

答えて

0

whenever gemhttps://github.com/javan/wheneverは、cronを使用してタスクを実行できます。

whenever cron jobを設定して、すべてのユーザーを経由してタイムゾーンを確認することができます。時刻が一致すると、そのユーザーに固有の何かを行うことができます。

例:whenever cron jobをセットアップして毎時タスクを実行します。このタスクでは、ユーザーのタイムゾーンをチェックするメソッドを呼び出し、タイムゾーンが一致する場合は、その特定のユーザーの別のrake taskまたはmethodを呼び出します。

+0

私の質問はタスクの実行方法とは関係ありません。私はcronジョブを実行する方法といつもの宝石を使う方法を知っています。 – Preacher

関連する問題