2016-12-01 5 views
2

複数の条件に基づいて1日のステータスを設定するロジックを作成する必要があります。私は複数のif文を作成することから始めましたが、それは正しく感じません。正しいアプローチでお手伝いください。レールモデルで複数のif条件を簡略化

def set_status_of_day(late_policy,early_departure_policy) 
     if late_policy.warning_on_late == "Half Day" && early_departure_policy.warning_on_late == "Half Day" 
      self.status_of_day = "Absent" 
     elsif late_policy.warning_on_late == "Half Day" && early_departure_policy.warning_on_late == "Present" 
      self.status_of_day = "Half Day" 
     elsif late_policy.warning_on_late == "Half Day" && early_departure_policy.warning_on_late == "Early Departure" 
      self.status_of_day = "Half Day" 
     elsif late_policy.warning_on_late == "Late" && early_departure_policy.warning_on_late == "Early Departure" 
      self.status_of_day = "Half Day" 
     elsif late_policy.warning_on_late == "Present" && early_departure_policy.warning_on_late == "Present" 
      self.status_of_day = "Present" 
     . 
     . 
     . 
     . 
     . 
     . 
     . 
     end    
end 

おかげ

答えて

2
def set_status_of_day(late_policy, early_departure_policy) 
    case [late_policy.warning_on_late, early_departure_policy.warning_on_late] 
    when ["Half Day", "Half Day"] then "Absent" 
    when ["Half Day", "Present"], ["Half Day", "Early Departure"], ["Late", "Early Departure"] then "Half Day" 
    when ["Present", "Present"] then "Present" 
    . 
    . 
    . 
    end 
end 

ケーリーSwovelandのような行をするときのコメントで提案されている私は2番目を追加しました。 when節のコンマは、or-conjuctionのように動作します。 mor情報については、caseを参照してください。

+0

私たちは同様にこれを行うことができます知りませんでした:O –

+1

私はあなたの両方が完了していることが、もう一つの 'とき/ then'句を追加提案(ない' ... ')ありません「半日」、「現在」、「半日」、「早期出発」、「半日」、「後期」、「半日」、「半日」、 –

1

ただ、少し大きいソリューションが、多分それはあなたが値(一日のスタートのための0、一日の終わりのための1、...)を割り当て、長さを計算することができ便利

KEYS = { 
    "Half Day" => 0, 
    "Present" => 1, 
    "Early Departure" => 2, 
    "Late" => 3 
} 

STATUSES = [ 
    { keys: [[0, 0]], value: "Absent" }, 
    { keys: [[0, 2], [2, 3], [0, 1]], value: "Half Day" }, 
    { keys: [[1, 1]], value: "Present" } 
] 

def status(late_warning, early_warning) 
    result = STATUSES.find { |status| status[:keys].include? [KEYS[late_warning], KEYS[early_warning]] } || { value: 'Unknown'} 
    result[:value] 
end 

# For example: 
# status("Half Day", "Half Day") 
#=> "Absent" 
# 
# status("Half Day", "Half D") 
#=> "Unknown" 


def set_status_of_day(late_policy,early_departure_policy) 
    self.status_of_day = status(late_policy.warning_on_late, early_departure_policy.warning_on_late)    
end 
1

だろう(0に近いものは「不在」、1に近いものは「存在する」)。

@morning_hash = { 
    "Present" => 0.0, 
    "Late"  => 0.25, 
    "Half Day" => 0.5, 
} 

@afternoon_hash = { 
    "Half Day" => 0.5, 
    "Early" => 0.75, 
    "Present" => 1.0, 
} 

def duration_description(morning, afternoon) 
    duration = @afternoon_hash[afternoon][email protected]_hash[morning] 
    case duration 
    when 0...0.25 then "Absent" 
    when 0.25..0.75 then "Half Day" 
    when 0.75..1.0 then "Present" 
    end 
end 

puts duration_description("Half Day", "Half Day") == "Absent" 
puts duration_description("Half Day", "Present") == "Half Day" 
puts duration_description("Half Day", "Early") == "Half Day" 
puts duration_description("Late", "Early")  == "Half Day" 
puts duration_description("Present", "Present") == "Present" 

#=> true true true true true 

関連する問題