2017-05-13 23 views
0

我创建了一个Rails应用程序,让用户为事件预订门票。从现在起在Rails中执行15分钟的任务

一旦用户选择了他想购买的票,他有15分钟时间完成结账,否则票将被释放并可以由其他人预订。

如何在15分钟后“封锁”票15分钟并使其再次可用?

+0

您可以使用delayed_job在15分钟后运行任务吗? – django

+0

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

回答

1

在您的票据模型(或您使用的任何模型)中有状态字段,并在用户选择它时将其标记为partially_booked。

如果您使用的是延迟就业,

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

如果使用sidekiq,

YourWorker.perform_in(15.minutes, ticket_id) 

其中“your_method_here”或“YourWorker”将包含逻辑检查,如果预订已完成或不是,如果未完成,则将其标记为未分配。

+0

如何检索并显示页面上的剩余时间? –

+0

在sidekiq中,您必须在某处存储job_id,然后使用job = Sidekiq :: ScheduledSet.new.find_job(job_id)获取作业,然后job.at将返回作业应该运行的时间。 – rohan

+0

顺便说一句,你用什么背景工作。 – rohan

1

ActiveJob有助于在后台完成工作。使用ActiveJob,您可以为延迟的操作生成作业,并将它们排入队列以供稍后执行。您可以向模型添加一个布尔字段,如reserved,并在用户首次预留并运行后台作业时使其成为true,以便在15分钟后用户不会完成购买,将其设置回false:

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

活动作业是用于声明作业并使其在各种排队后端上运行的框架。要设置ActiveJob的后端,请查看DelayedJob。这很简单,足够好。

+0

ActiveJob(内置于Rails)和DelayedJob/Sidekiq/Resque之间有什么区别? –

+0

'ActiveJob'是围绕作业处理后端的标准包装器,如DelayedJob,Resque或sidekiq,以便您可以用同样的方式与所有人交谈。例如,您可以随时将后端从Resque更改为Sidekiq,而无需更改Job类别。 –

+0

如果你想显示完成购买的剩余时间,你可以创建一个'Reservation'模型[像这样](https://image.ibb.co/dQvPgQ/Screen_Shot_1396_02_24_at_12_26_27.png),并获得当前时间和预留created_at时间。 –