2012-03-29 13 views
4

Ich habe ein Ruby on Rails-Modell, das eine Spalte namens expiration_date hat. Sobald das Ablaufdatum erreicht ist, möchte ich, dass eine andere Spalte im Modell geändert wird (z. B. expired = true). Was sind einige gute Möglichkeiten, dies zu tun?Aufruf einer Modellmethode zu einer bestimmten Zeit (Ruby on Rails)

Idealerweise möchte ich eine Modellfunktion genau zu dem Zeitpunkt aufrufen, zu dem das Ablaufdatum erreicht ist.

+0

Gibt es noch etwas, das Sie tun möchten, außer die Einstellung 'expired = true'? –

Antwort

1

Für das Szenario, das Sie beschreiben, ist die beste Lösung, eine expired-Methode anstelle einer Spalte zu haben, die true zurückgibt, wenn die größer oder gleich dem aktuellen Datum ist.

Für andere Szenarien würde ich mit einem geplanten Ereignis DB eine gespeicherte Prozedur auslösen gehen. Diese Prozedur würde die expiration_date Spalte für alle Zeilen in der Modelltabelle überprüfen und die expired (oder andere (n)) Spalte (n) entsprechend aktualisieren.

0

Haben Sie überlegt, einen Scheduler zu verwenden, um dies zu automatisieren? Etwas wie Resque, Delayed Job oder Cron würde gut funktionieren.

Dann in der geplanten Aufgabe Sie etwas davon haben könnten:

if foo.expiration_date < Time.now 
    foo.is_expired = true 
    foo.save 
end 
4

Verwenden delayed_job gem. Führen Sie nach der Installation von delayed_job gem Folgendes aus:

class Model < ActiveRecord::Base 

    after_create :set_expiry_timer 

    # register the timer 
    def set_expiry_timer 
    delay(:run_at => expiration_date).expire 
    end 

    def expire 
    update_attribute(:is_expired, true) unless is_expired? 
    end 

end 
Verwandte Themen