Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.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 将一个时间与一系列时间进行比较,并在之前、期间或之后返回_Ruby On Rails_Ruby_Time_Range - Fatal编程技术网

Ruby on rails 将一个时间与一系列时间进行比较,并在之前、期间或之后返回

Ruby on rails 将一个时间与一系列时间进行比较,并在之前、期间或之后返回,ruby-on-rails,ruby,time,range,Ruby On Rails,Ruby,Time,Range,我正在设备上创建一个状态,该状态将根据设备发回读数的时间设置该设备的指示灯颜色。这是我当前的解决方案: def indicator(device) # ... time = latest_event_time(device.id) case when time < 12.hours.ago :red when time.between?(12.hours.ago, 2.hours.ago) :yellow when 2.hours.ago <

我正在设备上创建一个状态,该状态将根据设备发回读数的时间设置该设备的指示灯颜色。这是我当前的解决方案:

def indicator(device)
  # ...
  time = latest_event_time(device.id)

  case
  when time < 12.hours.ago
    :red
  when time.between?(12.hours.ago, 2.hours.ago)
    :yellow
  when 2.hours.ago < time
    :green
  else
    :gray
  end
end

private

def latest_event_time(dev_id)
  # Get latest event time from database
end
是否有我缺少的方法,或另一种更干净的方法来完成此任务?

您可以为以下操作重载操作员:

到config/initializers/extensions.rb。根据需要创建目录和文件。

您可以为以下操作重载操作员:


到config/initializers/extensions.rb。必要时创建目录和文件。

不知道你是否认为这是一个改进,但是:

color = [ [12, :red], [2, :yellow], [0, :green] ].find do |n, c| 
  n.hours.ago >= time
end.last

不知道你是否认为这是一个进步,但是:

color = [ [12, :red], [2, :yellow], [0, :green] ].find do |n, c| 
  n.hours.ago >= time
end.last
那么:

def time_to_color(time)  
  { green: 2, yellow: 12, red: Float::Infinity }.find { |_,t|
    time <= t.hours_ago }.first
end
也许我遗漏了什么,但我不知道如何才能找回格雷。我这样组织是为了处理未来的时间。

怎么样:

def time_to_color(time)  
  { green: 2, yellow: 12, red: Float::Infinity }.find { |_,t|
    time <= t.hours_ago }.first
end


也许我遗漏了什么,但我不知道如何才能找回格雷。我这样组织是为了将来处理时间。

我想这是个小问题。如果time=time.now+3600怎么办?好吧,如果一台设备报告它的最后一次更新是在将来,OP可能会想做一些不同的事情。对于阅读问题不够谨慎的指控,我认罪。谢谢你的建议!我更喜欢@CarySwoveland使用散列,但我更喜欢您的编号,因为正如您所指出的,我不需要为将来的事件进行优化。我认为这是个小问题。如果time=time.now+3600怎么办?好吧,如果一台设备报告它的最后一次更新是在将来,OP可能会想做一些不同的事情。对于阅读问题不够谨慎的指控,我认罪。谢谢你的建议!我更喜欢@CarySwoveland使用散列,但我更喜欢你的编号,因为正如你所指出的,我不需要为将来的事件进行优化。我从不认为在我关心排序的地方使用散列。我想,要克服的习惯太多了。@MarkReed,我理解。我们这些年轻人可没那么难受。哎哟!把它揉进去,现在这是一个有趣的方法。我认为它比原始代码稍显迟钝,但似乎朝着更干净的方向发展。我会仔细考虑的。谢谢你说得对:格雷永远不应该担心,但我宁愿显式地设置一个else,而不是让它去碰运气。我从来没有想过在我关心排序的地方使用哈希。我想,要克服的习惯太多了。@MarkReed,我理解。我们这些年轻人可没那么难受。哎哟!把它揉进去,现在这是一个有趣的方法。我认为它比原始代码稍显迟钝,但似乎朝着更干净的方向发展。我会仔细考虑的。谢谢你说得对:格雷永远都不应该担心,但我宁愿显式地设置一个else,而不是让它去碰运气。我不认为这是一种改进,因为你刚刚将我的case语句转换为if/else。@styger请参阅重载运算符的第三种选择。请投票给一个有趣的解决方案!我通常不喜欢monkeypatching,所以我不会在生产代码中使用它,但它接近于我想要的。谢谢@斯泰格:这很好——一个女人的monkeypatch是另一个男人的延伸。然而,考虑所有的MyKebug修补程序都添加到字符串类:。在我看来,您已经选择了一个非常好的操作员来过载,因为这有一个小于内置的建议。Range类不使用此运算符,因此不可能发生冲突。如果它出现,我会在我的项目中使用它。我不认为这是一种改进,因为您刚刚将我的case语句转换为if/else。@styger请参阅重载运算符的第三种选择。请投票选择一个有趣的解决方案!我通常不喜欢monkeypatching,所以我不会在生产代码中使用它,但它接近于我想要的。谢谢@斯泰格:这很好——一个女人的monkeypatch是另一个男人的延伸。然而,考虑所有的MyKebug修补程序都添加到字符串类:。在我看来,您已经选择了一个非常好的操作员来过载,因为这有一个小于内置的建议。Range类不使用此运算符,因此不可能发生冲突。如果有机会,我会在我的项目中使用它。。
def time_to_color(time)  
  { green: 2, yellow: 12, red: Float::Infinity }.find { |_,t|
    time <= t.hours_ago }.first
end