2016-11-03 3 views
0

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.

+0

Verwenden Sie einen Edelstein wie [wann immer] (https://github.com/javan/whenever). Glücklich? – MarsAtomic

+0

Der obige Code wird von einem Cron-Job ausgeführt. – Preacher

Antwort

0

Sie können die whenever gemhttps://github.com/javan/whenever verwenden, die cron verwendet, um Aufgaben auszuführen.

Sie können einen whenever cron job einrichten, um alle Benutzer durchzugehen und ihre Zeitzonen zu überprüfen. Wenn die Zeit übereinstimmt, können Sie etwas für diesen Benutzer festlegen.

Beispiel: Setup whenever cron job Task jede Stunde ausführen. Diese Task ruft eine Methode auf, die die Zeitzonen des Benutzers überprüft. Wenn die Zeitzone übereinstimmt, ruft sie eine andere rake task oder method für diesen bestimmten Benutzer auf.

+0

Meine Frage hat nichts mit der Ausführung der Aufgabe zu tun. Ich bin mir bewusst, wie man Cron-Jobs ausführt und wie man das Wann-Juwel benutzt. – Preacher

Verwandte Themen