[英]How to set timer to automatically set a field value if not updated within 15 minutes in rails from the time of creation?
我有一个 rails 应用程序,其中将订单分配给供应商以接受或拒绝该供应商为该特定订单在订单分配表中存储为状态的订单。 如果订单在 15 分钟内没有被供应商接受或拒绝,那么该订单应该是自动拒绝的,即状态更新为该供应商自动拒绝并存储到表中。我如何完成此任务?
Estamps::Order
has_many :order_assignments
belongs_to :vendor
Estamps::Vendor
has_many :order_assignments
has_many :orders
Estamps::OrderAssignment
belongs_to :vendor, class_name: 'Estamps::Vendor'
belongs_to :order, class_name: 'Estamps::Order'
OrderAssignment 表的架构:
t.string "status"
t.integer "vendor_id"
t.integer "order_id
将订单分配给供应商后,供应商应将状态更新为已接受、已拒绝。 如果在 15 分钟内没有更新任何指定的订单,状态应自动设置为拒绝。 这应该发生在任何指定的订单上。 任何人都可以帮助我实现这一目标吗? 我是这里的 rails 新手。
这里的答案是正确的,它非常适合队列,但请注意,Rails 在所有名为 activejob 的队列之上公开了一个很好的 API: http ://edgeguides.rubyonrails.org/active_job_basics.html
您所要做的就是选择一个作业队列(流行的选择:sidekiq、resque、delayed_job)。 请注意,delayed_job 将是最容易部署的,因为它没有额外的依赖项,例如 redis ( https://github.com/collectiveidea/delayed_job )。
例如,安装后,delayed_job 之后,您要做的就是在创建订单分配后将作业排入队列,在 15 分钟后检查其状态,如下所示:
Estamps::OrderAssignment
after_create :enqueue_check_status
def enqueue_check_status
#this is activejob syntax to enqueue a job at a later time
OrderStatusJob.set(wait: 15.minutes).perform_later(self.id)
end
#the rails way to define a job class
class OrderStatusJobJob < ApplicationJob
queue_as :default
def perform(order_assignment_id)
order_assignment = OrderAssignment.find(order_assignment_id)
if order_assignment.status != true
order_assignment.update_attribute('status', 'REJECTED')
end
end
end
这可以使用像 sidekiq 或 resque 这样的调度程序来实现。 这将在后台执行这些操作,不会打扰控制器。 但问题是我们需要 redis 服务器来完成这项工作。 无论如何检查文档。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.