2012-09-29 52 views
0

我得到了下面的Rake Task,每天運行一個來解決我的應用程序中的一些賭注。但我很確定它可以簡單化,所以IF-THEN語句可以用CASE語句代替。簡化多個if-then rake任務

我假設多個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 
+0

此外,您可能需要考慮將此邏輯轉換爲像「Bet.settle_all」這樣的方法,然後從這裏調用它。如果它保存在模型中,那麼維護業務邏輯就會更容易。如果你計劃擁有大量的Bet記錄,你也應該使用'find_each'而不是'each'。最後但並非最不重要的一點,考慮將'each'塊的內部移動到實例方法'Bet#settle'中,並將一些if語句提取到私有實例方法中。 – nertzy

回答

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 

拉出入駐並且保存東西可以讓您輕鬆地整合其他功能(如果需要的話),而不必在每個案件中都複製它。

+0

現在看到更簡單..謝謝.. – Twiddr

3

它似乎是

bet.settle總是真 bet.profitloss爲-10 除非(bet.price.value> bet.value和bet.buy)或(bet.price.value < bet.Value和!bet.buy) 在這種情況下,它是10

從以下真值表

< 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語句做整個事情有一個得到這個,得到w ^儘管如此,仍然在測試中。 :)

+0

聽起來是正確的..但是,是的,它似乎變得非常混亂,如果它將在一個如果聲明.. 它會給任何性能增益做到一行而不是jethroos解決方案? – Twiddr

+0

除非您在任何一次投注中都處理了很多投注,否則我會嚴重懷疑它。 –