创建或更新后如何更新属性

时间:2019-04-25 17:25:16

标签: ruby-on-rails-5.2

我是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作业或类似的方式,但不确定是否可以进行设置。我希望在此问题上有任何指导。

1 个答案:

答案 0 :(得分:0)

对于需要很长时间才能完成的过程,请考虑将其置于后台过程中。我将结合使用sidekiq和redis进行签出。这是进行后台处理的好选择。