Ich möchte einige Informationen zu den einzelnen Benutzern verwalten, aber ich möchte, dass sie nur um Mitternacht in der Zeitzone des Benutzers stattfinden. Die Tabelle des Benutzers hat eine time_zone
Spalte, die standardmäßig auf Eastern verweist.Wie wird eine Rake-Aufgabe zu einer bestimmten Tageszeit pro Benutzer-Zeitzone in Rails ausgeführt?
Bisher habe ich die folgende Rake Aufgabe gestellt, jede Stunde auszuführen:
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
Dieser Code scheint mit einer Testdatenbank von 20 Benutzern in meinen Tests zu arbeiten, wobei etwa 4 Sekunden. Mein Problem ist, dass es auf einem Produktionsserver mit Tausenden von Benutzern ineffizient sein wird und dass das manuelle Festlegen eines Zeitfensters (Zeilen 4-5) zu Problemen führen wird.
Was ist eine bessere Möglichkeit, diese Aufgabe zu schreiben?
Edit für noch mehr Klarheit: Ich weiß, wie Sie diese Aufgabe regelmäßig ausführen. Ich frage, ob die Aufgabe selbst besser geschrieben werden kann.
Verwenden Sie einen Edelstein wie [wann immer] (https://github.com/javan/whenever). Glücklich? – MarsAtomic
Der obige Code wird von einem Cron-Job ausgeführt. – Preacher