Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 简化rails模型中的多个if-else条件_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails 简化rails模型中的多个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

我必须创建基于多个条件设置当天状态的逻辑。我一开始创建了多个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.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