【问题标题】:Simplify multiple if-then rake task简化多个 if-then rake 任务
【发布时间】: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


【解决方案1】:

好像是

bet.settle 始终为真 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

所以你几乎可以用一个 if 语句来完成所有的事情,不过可以通过测试来进行编织。 :)

【讨论】:

  • 听起来不错..但是是的,如果将它放在一个 if 语句中,它似乎会变得非常混乱.. 它会在一行而不是 jethroos 解决方案中提供任何性能提升吗?
  • 除非你在任何一场比赛中都下很多赌注,否则我严重怀疑。
【解决方案2】:

也许你可以像这样实现它:

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

取出已解决并保存的东西可以让您在需要时轻松集成其他功能,而无需在每个 if 或 when 情况下都复制它。

【讨论】:

  • 你应该把作业拉到案外“无利可图”。
猜你喜欢
  • 2019-08-02
  • 2011-07-04
  • 2010-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多