【发布时间】:2012-09-29 19:30:40
【问题描述】:
我得到了下面的 Rake 任务,它每天运行一个来结算我的应用程序中的一些赌注。但我很确定它可以简单化,所以 IF-THEN 语句可以用 s CASE 词干代替。
我假设多个 IF 语句的运行时间比使用 CASE 选项的相同进程要长。对吗?
我只是不确定如何将其从 IF-THEN 转换为 CASE 选项..
task :settle => :environment do
@bets = Bet.where(:settle => false)
@bets.each do |bet|
if not bet.value.nil?
if bet.price.value > bet.value and bet.buy == true then
bet.profitloss = 10
bet.settle = true
bet.save
end
if bet.price.value < bet.value and bet.buy == false then
bet.profitloss = 10
bet.settle = true
bet.save
end
if bet.price.value > bet.value and bet.buy == false then
bet.profitloss = -10
bet.settle = true
bet.save
end
if bet.price.value < bet.value and bet.buy == true then
bet.profitloss = -10
bet.settle = true
bet.save
end
if bet.price.value = bet.value then
bet.profitloss = -10
bet.settled = true
bet.save
end
end
end
end
【问题讨论】:
-
另外,您可能需要考虑将此逻辑移动到像
Bet.settle_all这样的方法中,然后从这里调用它。如果业务逻辑存在于您的模型中,则更容易维护它。如果您计划拥有大量投注记录,您还应该使用find_each而不是each。最后但同样重要的是,考虑将each块的内部移动到实例方法Bet#settle中,并将一些 if 语句提取到私有实例方法中。
标签: ruby-on-rails if-statement scheduled-tasks rake-task