繁体   English   中英

如果从创建之日起 15 分钟内未在 rails 中更新,如何设置计时器以自动设置字段值?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM