Ruby on rails 简化多if-then-rake任务
我得到了下面的Rake任务,它每天运行一次,在我的应用程序中结算一些赌注。但是我很确定它可以简化,所以IF-THEN语句可以用s CASE语句代替 我假设多个IF语句的运行时间比使用CASE选项的同一进程要长。对吗 我只是不知道如何将它从IF-THEN转换为CASE选项Ruby on rails 简化多if-then-rake任务,ruby-on-rails,if-statement,scheduled-tasks,rake-task,Ruby On Rails,If Statement,Scheduled Tasks,Rake Task,我得到了下面的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
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
任务:结算=>:环境执行
@下注=下注。其中(:结算=>false)
@下注。每个人都下注|
如果不是bet.value.nil?
如果bet.price.value>bet.value和bet.buy==true,则
bet.profitloss=10
bet.settle=true
打赌,救命
结束
如果bet.price.valuebet.value和bet.buy==false,则
bet.profitloss=-10
bet.settle=true
打赌,救命
结束
如果bet.price.value
也许您可以像这样实现它:
task :settle => :environment do
@bets = Bet.where(:settle => false)
@bets.each do |bet|
if not bet.value.nil?
case
when bet.price.value > bet.value and bet.buy == true
profitloss = 10
when bet.price.value < bet.value and bet.buy == false
profitloss = 10
when bet.price.value > bet.value and bet.buy == false
profitloss = -10
when bet.price.value < bet.value and bet.buy == true
profitloss = -10
when bet.price.value = bet.value
profitloss = -10
end
if profitloss
bet.settled = true
bet.profitloss = profitloss
bet.save
end
end
end
任务:结算=>:环境执行
@下注=下注。其中(:结算=>false)
@下注。每个人都下注|
如果不是bet.value.nil?
案例
当bet.price.value>bet.value和bet.buy==true时
profitloss=10
当bet.price.valuebet.value和bet.buy==false时
profitloss=-10
当bet.price.value
如果需要,通过提取已解决和保存的内容,您可以轻松集成其他功能,而无需在每个if或when情况下进行复制 也许你可以像这样实现它:
task :settle => :environment do
@bets = Bet.where(:settle => false)
@bets.each do |bet|
if not bet.value.nil?
case
when bet.price.value > bet.value and bet.buy == true
profitloss = 10
when bet.price.value < bet.value and bet.buy == false
profitloss = 10
when bet.price.value > bet.value and bet.buy == false
profitloss = -10
when bet.price.value < bet.value and bet.buy == true
profitloss = -10
when bet.price.value = bet.value
profitloss = -10
end
if profitloss
bet.settled = true
bet.profitloss = profitloss
bet.save
end
end
end
任务:结算=>:环境执行
@下注=下注。其中(:结算=>false)
@下注。每个人都下注|
如果不是bet.value.nil?
案例
当bet.price.value>bet.value和bet.buy==true时
profitloss=10
当bet.price.valuebet.value和bet.buy==false时
profitloss=-10
当bet.price.value
如果需要,通过提取已解决和保存的内容,您可以轻松集成其他功能,而无需在每个if或when情况下进行复制 似乎是这样
打赌。结算总是正确的
bet.profitloss为-10
除非(bet.price.value>bet.value和bet.buy)或(bet.price.value< bet | = bet | > bet | buy || settle || profit
0 | 0 | 1 | 0 || 1 || 0
0 | 0 | 1 | 1 || 1 || 1
0 | 1 | 0 | 0 || 1 || 0
0 | 1 | 0 | 1 || 1 || 0
1 | 0 | 1 | 0 || 1 || 1
1 | 0 | 1 | 1 || 1 || 0
bet |买入|结算|利润
0 | 0 | 1 | 0 || 1 || 0
0 | 0 | 1 | 1 || 1 || 1
0 | 1 | 0 | 0 || 1 || 0
0 | 1 | 0 | 1 || 1 || 0
1 | 0 | 1 | 0 || 1 || 1
1 | 0 | 1 | 1 || 1 || 0
因此,您几乎可以用一个if语句完成整个过程,但要通过测试来实现。:) 似乎是这样
打赌。结算总是正确的
bet.profitloss为-10
除非(bet.price.value>bet.value和bet.buy)或(bet.price.value< bet | = bet | > bet | buy || settle || profit
0 | 0 | 1 | 0 || 1 || 0
0 | 0 | 1 | 1 || 1 || 1
0 | 1 | 0 | 0 || 1 || 0
0 | 1 | 0 | 1 || 1 || 0
1 | 0 | 1 | 0 || 1 || 1
1 | 0 | 1 | 1 || 1 || 0
bet |买入|结算|利润
0 | 0 | 1 | 0 || 1 || 0
0 | 0 | 1 | 1 || 1 || 1
0 | 1 | 0 | 0 || 1 || 0
0 | 1 | 0 | 1 || 1 || 0
1 | 0 | 1 | 0 || 1 || 1
1 | 0 | 1 | 1 || 1 || 0
因此,您几乎可以用一个if语句完成整个过程,但要通过测试来实现。:)也可以考虑把这个逻辑转换成一个方法,例如:代码> BET。如果业务逻辑存在于您的模型中,那么维护业务逻辑就更容易了。如果您计划拥有大量的下注记录,您还应该使用
find_each
而不是each
。最后但并非最不重要的一点是,考虑将<>代码>每个块内部移动到一个实例方法<代码> BET-y>解决< /代码>中,并将一些IF语句提取到私有实例方法中。如果业务逻辑存在于您的模型中,那么维护业务逻辑就更容易了。如果您计划拥有大量的下注记录,您还应该使用find_each
而不是each
。最后但并非最不重要的一点是,考虑将<代码>内部的每个块转换为实例方法<代码> BETγ>解决< /代码>,并将一些IF语句提取到私有实例方法中。但是是的,如果要在一个if语句中出现,它看起来会变得非常混乱。。在一条线上而不是在Jethoos解决方案中这样做会带来性能提升吗?除非你在任何一次跑步中都下了很多赌注,否则我严重怀疑这一点。听起来不错。。但是是的,如果要在一个if语句中出现,它看起来会变得非常混乱。。在一条线上而不是在Jethoos解决方案中这样做会带来性能提升吗?除非你在任何一次运行中都下了很多赌注,否则我严重怀疑这一点。