Ruby on rails 简化多if-then-rake任务

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

我得到了下面的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
任务:结算=>:环境执行
@下注=下注。其中(:结算=>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解决方案中这样做会带来性能提升吗?除非你在任何一次运行中都下了很多赌注,否则我严重怀疑这一点。