2016-09-02 17 views
1

Ich habe eine Timer-Klasse in meiner Anwendung festgelegt, um 24 Stunden nach der Erstellung ablaufen.Wie ändere ich Attribute eines Modells nach einer festgelegten Zeit

Gibt es eine Möglichkeit, expire_if_running 24 Stunden nach dem Erstellungsdatum auszuführen, oder muss ich jede Minute einen Cron-Job ausführen?

class Timer < ApplicationRecord 
    enum status: { 
    running: 1, # the default 
    expired: 2 # timed out 
    finished: 3 # completed 
    } 

    # if the Timer isn't finished, expire it 
    def expire_if_running 
    self.status = "expired" if self.running? 
    end 
end 

Bitte geben Sie Beispielcode oder ein Zitat für Ihre Antwort. Ich habe ActiveJob noch nie zuvor verwendet und ich habe das schwache Gefühl, dass dies der Fall ist, der es erfordert.

Antwort

1

Ich habe einen Weg gefunden, genau dieses Szenario mit delayed_job zu starten, was besser ist, da es zu einem Zeitpunkt in der Zukunft läuft.

Ein Cronjob von Minute zu Minute kann 59 Sekunden zu spät in den Timer ablaufen.
Ein Cronjob stundenweise kann 59 Minuten zu spät in den Timer ablaufen.

Hier ist ein tutorial von Twilio auf, wie man eine Erinnerung App macht.

0

Das Ausführen eines "Cron-Jobs" ist eine Möglichkeit, dies zu tun. Aber anstatt jede Minute zu laufen, wäre es besser, sie jede Stunde zu laufen, es sei denn, es gibt einen bestimmten Grund, eine 1-Minuten-Genauigkeit zu haben.

ActiveJob (reference) ist eine Möglichkeit, dies zu tun. Ich würde Sidekiq empfehlen, weil es gut für uns funktioniert. Aber ohne spezifische Informationen über Ihre Umgebung (Heroku?) Kann ich nicht genau angeben, wie es geht.

+0

Wir verwenden derzeit Heroku in der Produktion, aber wir planen, irgendwann zu unserer eigenen Infrastruktur zu wechseln. Hat ActiveJob keine eigene Syntax wie ActiveRecord mit ORM. – amingilani

+0

Nach dem Lesen der Dokumente für ActiveJob scheint es, dass eine Aufgabe zu einem bestimmten Zeitpunkt in der Zukunft ausgeführt wird. Für die Funktion "Cron-Job" können Sie den Heroku-Scheduler verwenden. Schreiben Sie eine Rake-Aufgabe, die den Status aller abgelaufenen Jobs aktualisiert. –

Verwandte Themen