各ユーザーの情報にいくつかのメンテナンスを実行したいが、それはユーザーのタイムゾーンごとに真夜中頃にしか発生しないようにしたい。ユーザーの表には、デフォルトで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行目)に頼ると問題が発生することです。
このタスクを作成するには、どのような方法が良いですか?
さらに明確にするために編集:私はこのタスクを定期的に実行する方法を知っています。私は仕事そのものがより良く書けるかどうか尋ねています。
[いつでも](https://github.com/javan/whenever)のような宝石を使用してください。ハッピー? – MarsAtomic
上記のコードは、cronジョブによって実行されます。 – Preacher