我是Rails的新手,我试图找出以下内容。
我有一个Order类,它具有名称,状态和半径属性。可能的状态为[草稿,过帐,已采取]。每次循环运行时,半径可以从500更改为5k,并增加500。我想知道如何根据状态和经过的时间来改变半径。
如果@ order.status =草稿,则状态= 500。 如果@ order.status =发布,则半径值将从500开始,但每10秒增加500,直到达到40。 如果@ order.status =接受,则半径的值将等于状态更改为接受时的半径。 如果40秒后获取了order.status!=,则@ order.status =草稿,@ order.radius = 500
以下代码仅在可视化中在ruby中运行良好,如果将其复制到终端,则会看到其运行良好。
count = 1 initial_radius = 500
输入“输入状态:” 状态=获取 状态= status.chomp
状态=='已发布'&&计数<4#这将是一次决定(n)#次以最大搜索半径为10k的次数,否则返回草稿
puts ""
puts "Run #{count}"
radius = 500
puts "Radius = #{radius}"
n = 1
while status == 'posted' && n <10
status = 'posted'
puts " Status is now = #{status.capitalize}! "
sleep(1)
puts "n = #{n}"
puts "Enter the status: "
status = gets
status = status.chomp
n += 1
start = Time.now
puts "Radius = #{radius}"
end
if status == 'posted'
count += 1
radius *= count
puts "New Radius = #{radius}"
elsif status == 'taken'
radius *= count
puts ""
puts "Order has been Taken with radius #{radius}!!"
puts ""
end
#radius = 500 This was removed as it didn't affect
结束
如果状态=='已采取' 放入“” 其他 放入“” 放置“没有公司接订单” 将“订单返回到草稿状态,其半径为#{initial_radius}” 放入“” 结束
但是,当我尝试以下操作以查看服务器的行为并创建新的Order时,它将挂起,直到完成对之前已下的任何订单的处理为止。我知道它由于睡眠方法而挂起。下面的代码仅用于查看其行为。它确实会在15秒后更新半径,但是没有人愿意使用一种应用程序,该应用程序需要等到别人完成操作为止。
订单模型
after_save:change_radius,在:[:create,:update]
def change_radius
如果self.status =='已发布'
睡觉15
update_column(:radius,1000)
elsif self.status =='草稿'
update_column(:radius,500)
结束
结束
我的问题是。如何使它正常工作,以便其他用户可以使用该应用程序(创建订单)而不会挂起,直到它处理完另一个用户的订单为止。我认为它可能需要使用Active作业或类似的方式,但不确定是否可以进行设置。我希望在此问题上有任何指导。