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