Ruby on rails 简化rails模型中的多个if-else条件
我必须创建基于多个条件设置当天状态的逻辑。我一开始创建了多个if-else语句,但感觉不对。请用正确的方法帮助我Ruby on rails 简化rails模型中的多个if-else条件,ruby-on-rails,ruby,Ruby On Rails,Ruby,我必须创建基于多个条件设置当天状态的逻辑。我一开始创建了多个if-else语句,但感觉不对。请用正确的方法帮助我 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.s
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
谢谢
当Cary Swoveland在评论中建议时,我添加了第二行。when子句中的逗号与or连用类似。
查看文档中的mor信息。只是一个更大的解决方案,但可能会有所帮助
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
您可以指定值(0表示一天的开始,1表示一天的结束,…)并计算一天的长度(接近0表示“缺席”,接近1表示“存在”)
~我不知道我们也可以这样做:我建议你再添加一个
when/then
子句,既要完整(no…
),又要说明一个有用的结构:when[“半天”,“现在”],[“半天”,“早退”],[“半天”,“晚点”]“半天”
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
@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