0

Ich verwende verzögerte Jobs in meiner Rails 5-Anwendung.Entfernen Sie alle verzögerten Jobs für ein bestimmtes Objekt in Rails 5

Zum Beispiel habe ich einen Trip Modell und bin die Schaffung von zwei verzögerten Jobs:

Trip.delay(run_at: ...).send_reminder 
Trip.delay(run_at: ...).get_feedback 

Also habe ich zwei verzögerte Arbeitsplätze.

Jetzt wenn die Reise gelöscht wird möchte ich auch die verzögerten Aufträge löschen und, noch wichtiger, wenn die Reise geändert wird, möchte ich die Aufträge aktualisieren (neue run_at Zeit), also würde ich löschen und neu erstellen die Jobs.

Aber wie kann ich die Jobs identifizieren, die zu der Reise gehören? Gibt es irgendeine Methode dafür? Ich habe versucht, eine Spalte trip_id hinzuzufügen, weiß aber nicht, wie die trip_id beim Erstellen des neuen Jobs zugewiesen werden soll.

+0

Diese Seite Details hinzufügen zusätzliche Spalten und eine Zuordnung zu der Tabelle delayed_jobs: https: // Sunil kumarn.wordpress.com/2013/05/19/delayed-jobs-in-rails-adding-custom-attributes/ – Unixmonkey

Antwort

0

erstellen Jobklasse für jede DelayedJob Arbeit wie diese

class TripSendReminderJob < Struct.new(:trip) 
    def perform 
    # reload use the updated values of a trip, if it was changed 
    trip.send_reminder if trip.reload.active? # active? or any method or condition you need to check 
    end 
end 

Und dann überall in Ihrem Code

trip = Trip.find(trip_id) 
trip_send_reminder_job = TripSendReminderJob.new(trip) 
Delayed::Job.enqueue(trip_send_reminder_job, run_at: ...) 

Bonus, mit einem Auftragsobjekt wie TripSendReminderJob können Sie Haken verwenden, wie vor , Fehler, Fehler, etc. Sie können alle von ihnen in der DelayedJob github page

Verwandte Themen