gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 16:16:48 25 4
gpt4 key购买 nike

我有一个 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 在所有队列之上公开了一个很好的 API,称为 activejob: 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

关于ruby-on-rails - 如果自创建之日起 15 分钟内未在 Rails 中更新,如何设置计时器以自动设置字段值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42199703/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com