2017-05-13 4 views
0

Ich erstelle eine Rails-Anwendung, mit der Benutzer Tickets für ein Ereignis buchen können.Führen Sie in 15 Minuten eine Aufgabe in Rails aus

Sobald der Benutzer das Ticket, das er kaufen möchte, auswählt, hat er 15 Minuten Zeit, um den Kauf abzuschließen, ansonsten wird das Ticket freigegeben und kann von jemand anderem gebucht werden.

Wie kann ich das Ticket für 15 Minuten "blockieren" und nach 15 Minuten wieder verfügbar machen?

+0

Sie können delayed_job verwenden, um eine Aufgabe nach 15 Minuten auszuführen? – django

+0

http://stackoverflow.com/questions/5494369/how-to-schedule-a-function-to-execute-at-a-future-time – Iceman

Antwort

1

Haben Sie ein Statusfeld in Ihrem Ticketmodell (oder welches Modell Sie auch verwenden) und markieren Sie es als partially_booked, wenn der Benutzer es auswählt.

Wenn Aufträge verzögert verwenden,

handle_asynchronously :your_method_here, :run_at => Proc.new { 15.minutes.from_now } 

Wenn Sie sidekiq verwenden,

YourWorker.perform_in(15.minutes, ticket_id) 

wo ‚your_method_here‘ oder ‚YourWorker‘ die Logik enthalten zu überprüfen, wenn die Buchung abgeschlossen wurde oder nicht, und markieren Sie es als nicht zugewiesen, wenn es nicht abgeschlossen wurde.

+0

Wie kann man die verbleibende Zeit auf der Seite abrufen und anzeigen? –

+0

In sidekiq müssen Sie die job_id irgendwo speichern, dann holen Sie den Job mit job = Sidekiq :: ScheduledSet.new.find_job (job_id) und dann gibt job.at die Zeit zurück, zu der der Job ausgeführt werden soll. – rohan

+0

BTW, was verwenden Sie für Hintergrundjobs. – rohan

1

ActiveJob hilft, Jobs im Hintergrund zu tun. Mit ActiveJob können Sie Jobs für Ihre verzögerten Operationen generieren und sie für die spätere Ausführung in die Warteschlange stellen. Sie können Ihrem Modell ein boolesches Feld wie hinzufügen und es als wahr festlegen, wenn der Benutzer es zuerst reserviert und einen Hintergrundjob ausführt, sodass Benutzer den Kauf nicht abschließen können, indem Sie ihn auf false zurücksetzen:

TicketJob.set(wait_until: 15.minutes.from_now).perform_later(@ticket) 

Aktiver Job ist ein Framework zum Deklarieren von Jobs und zum Ausführen von Jobs auf einer Vielzahl von Warteschlangen-Back-Ends. Informationen zum Einrichten eines Back-Ends für ActiveJob finden Sie unter DelayedJob. Es ist einfach und gut genug.

+0

Was ist der Unterschied zwischen ActiveJob (in Rails integriert) und DelayedJob/Sidekiq/Resque? –

+0

'ActiveJob' ist ein Standard-Wrapper für die Verarbeitung von Backends wie DelayedJob, Resque oder sidekiq, so dass Sie auf die gleiche Weise mit ihnen kommunizieren können. Zum Beispiel können Sie jederzeit das Backend von Resque zu Sidekiq ändern, ohne Job-Klassen zu ändern. –

+0

Wenn Sie die verbleibende Zeit für den Abschluss eines Kaufs anzeigen möchten, können Sie ein Reservierungsmodell [wie dieses] (https://image.ibb.co/dQvPgQ/Screen_Shot_1396_02_24_at_12_26_27.png) erstellen und die Differenz zwischen der aktuellen Zeit und Reservierung created_at time. –

Verwandte Themen