Ruby on rails 如何在Rails中按时间段(HHMM~HHMM)创建fitler阵列

Ruby on rails 如何在Rails中按时间段(HHMM~HHMM)创建fitler阵列,ruby-on-rails,ruby,ruby-on-rails-4,mongoid,Ruby On Rails,Ruby,Ruby On Rails 4,Mongoid,我坐蒙哥德的飞机 我如何在两个时间间隔HHMM快速过滤航班 比如说, 当时间间隔为字符串06:00~09:00时 结果应该是 [2] #<Jetstar _id: 20150720_0655_1040_TPE_KIX|OSA, departure_at: 2015-07-20 06:55:00 UTC [5] #<Jetstar _id: 20150722_0655_1040_TPE_KIX|OSA, departure_at: 2015-07-22 06:55:00 UTC [7]

我坐蒙哥德的飞机

我如何在两个时间间隔HHMM快速过滤航班

比如说,

当时间间隔为字符串06:00~09:00时

结果应该是

[2] #<Jetstar _id: 20150720_0655_1040_TPE_KIX|OSA, departure_at: 2015-07-20 06:55:00 UTC
[5] #<Jetstar _id: 20150722_0655_1040_TPE_KIX|OSA, departure_at: 2015-07-22 06:55:00 UTC
[7] #<Jetstar _id: 20150723_0655_1040_TPE_KIX|OSA, departure_at: 2015-07-23 06:55:00 UTC
[1] #<Jetstar _id: 20150719_1245_1630_TPE_KIX|OSA, departure_at: 2015-07-19 12:45:00 UTC
[3] #<Jetstar _id: 20150720_1245_1630_TPE_KIX|OSA, departure_at: 2015-07-20 12:45:00 UTC
[4] #<Jetstar _id: 20150721_1245_1630_TPE_KIX|OSA, departure_at: 2015-07-21 12:45:00 UTC
[6] #<Jetstar _id: 20150722_1245_1630_TPE_KIX|OSA, departure_at: 2015-07-22 12:45:00 UTC
[8] #<Jetstar _id: 20150723_1245_1630_TPE_KIX|OSA, departure_at: 2015-07-23 12:45:00 UTC
[9] #<Jetstar _id: 20150724_1245_1630_TPE_KIX|OSA, departure_at: 2015-07-24 12:45:00 UTC
完整日期集
在mongoid中,您可以使用between搜索范围内的记录。我不建议您直接在Ruby中进行过滤,因为对于较大的数据集来说,这会很慢,而且会占用大量内存

这篇文章介绍了一个解决方案:

但是,如果您想在纯ruby中使用它,您可以:

start, finish = "06:00~09:00".split('~')
start_hour = start.split(':')[0].to_i
end_hour = finish.split(':')[0].to_i

flights.select do |flight|
  flight.departure_time.hour >= start_hour && flight.departure_time.hour <= end_hour
end
这将只查询几个小时。您可以通过执行以下操作来包括分钟数:

start, finish = "06:00~09:00".split('~')
start = start.split(':').map(&:to_i)
finish = finish.split(':').map(&:to_i)

# Work in minutes
start_minutes = start[0] * 60 + start[1]
finish_minutes = finish[0] * 60 + finish[1]

flights.select do |flight|
  dep_mins = flight.departure_time.hour * 60 + flight.departure_time.min
  dep_mins >= start_minutes && dep_mins <= finish_minutes
end
假设日期集是Jetstar对象的数组:


你试过什么类型的东西?你到底在坚持什么?你能给我们看一下你试过的代码吗?我正在计划如何编写那种代码来选择我想要的时间间隔。比如早上的航班06:00~09:00不,我认为用ruby做比用mongoid做要快。因为我只需要从数据库中获取整个数据,而不需要多次访问数据库。我不认为mongo可以过滤条件,无论是早上还是晚上:好的,我将更新我的解决方案以显示纯ruby方式:
start, finish = "06:00~09:00".split('~')
start = start.split(':').map(&:to_i)
finish = finish.split(':').map(&:to_i)

# Work in minutes
start_minutes = start[0] * 60 + start[1]
finish_minutes = finish[0] * 60 + finish[1]

flights.select do |flight|
  dep_mins = flight.departure_time.hour * 60 + flight.departure_time.min
  dep_mins >= start_minutes && dep_mins <= finish_minutes
end
require 'time'

def date_filter(datesets, min, max)
  datesets.select { |d| Time.parse(d.departure_at).hour.between?(min, max) }
end

# 06:00~09:00 inclusive
p(date_filter(datesets, 6, 9))

# 10:00~18:00 inclusive
p(date_filter(datesets, 10, 18))