在rails模型中简化多个if else条件

时间:2016-12-01 12:05:26

标签: ruby-on-rails ruby

我必须创建用于设置基于多个条件的日期状态的逻辑。我从创建多个if else语句开始,但感觉不对。请帮助正确的方法。

select max(velocity) from taxidatabase

由于

3 个答案:

答案 0 :(得分: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

我添加了像Cary Swoveland在评论中提到的第二个时间线。 when子句中的逗号就像or-conjuction一样。 请参阅mors信息文档中的case

答案 1 :(得分: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

答案 2 :(得分:1)

您可以指定值(0表示当天开始,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]-@morning_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