我目前正在开发一个Appointment系统并使用Ruby on Rails构建它。我有一个约会模型和约会控制器,在索引上,我想显示那天的约会列表,以30分钟的块分隔。
我有一个基本的工作版本,我有一个ruby方法,在表行上添加一个类,显示当前30分钟块是否是当前时间。
问题是,当时间在小时的开始和结束之间的任何地方时,它将行类设置为“current_time”。这不是我想要的。
def date_class(time)
now = DateTime.now.utc
if (now.beginning_of_hour..(now.end_of_hour - 0.5.hours)).cover?(time)
"current_time"
elsif ((now.beginning_of_hour + 0.5.hours)..now.end_of_hour).cover?(time)
"current_time"
elsif (now.beginning_of_day..now.end_of_hour).cover?(time)
"past"
else
"future"
end
end
有什么想法吗?
下面的屏幕截图显示代码正常工作并正确显示真或假。
答案 0 :(得分:2)
这不适合你吗?
def date_class(time)
now = DateTime.now.utc
return "past" if time < now.beginning_of_hour
return "current_time" if now.hour == time.hour && now.min < 30 && time.min < 30
return "current_time" if now.hour == time.hour && now.min >= 30 && time.min >= 30
return "future"
end
我确信有更好的方法,但我认为这也有用
答案 1 :(得分:2)
虽然它目前仅使用类Time的实例进行了测试,但time_frame gem可能是此类问题的替代解决方案:
require 'time_frame'
def date_class(time)
now = Time.now.utc
frame = TimeFrame.new(min: now.beginning_of_hour, duration: 29.minutes + 59.seconds)
frame = frame.shift_by(30.minutes) if now.min >= 30
return 'past' if frame.deviation_of(time) < 0.minutes
return 'current_time' if frame.cover?(time)
'future'
end
# Demo: Building 30.minutes interval blocks and print out the date class used by each block:
frame = TimeFrame.new(
min: (Time.now.utc - 2.hours).beginning_of_hour,
max: (Time.now.utc + 2.hours).beginning_of_hour
)
frame.split_by_interval(30.minutes).each do |interval|
puts "#{interval.min} -> #{date_class(interval.min)}"
end