2015-07-19 38 views
0

我得到了mongoid的航班。我如何在时间段(HHMM〜HHMM)在Rails中使用fitler array

我怎么能快速筛选time interval (HHMM)

之间。例如通过departure_at的航班,

当时间间隔是一个字符串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 

当时间间隔是一个字符串10:00~18:00

结果应该是

[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 

整个datesets

[1] #<Jetstar _id: 20150719_1245_1630_TPE_KIX|OSA, departure_at: 2015-07-19 12:45:00 UTC 
[2] #<Jetstar _id: 20150720_0655_1040_TPE_KIX|OSA, departure_at: 2015-07-20 06:55: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 
[5] #<Jetstar _id: 20150722_0655_1040_TPE_KIX|OSA, departure_at: 2015-07-22 06:55:00 UTC 
[6] #<Jetstar _id: 20150722_1245_1630_TPE_KIX|OSA, departure_at: 2015-07-22 12:45:00 UTC 
[7] #<Jetstar _id: 20150723_0655_1040_TPE_KIX|OSA, departure_at: 2015-07-23 06:55: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 
+0

类型的东西,你尝试过什么?你究竟坚持着什么?你能告诉我们你试过的代码吗? –

+0

我只是刨了如何编写这种代码樱桃选择我想要的时间间隔。像早上的航班06:00〜09:00' – user3675188

回答

1

在mongoid你可以使用之间做一个范围内的搜索记录。我不建议您直接在Ruby中进行过滤,因为这对于较大的数据集来说会很慢且需要大量内存。

这个帖子经过一个解决方案:

Query Mongodb on month, day, year... of a datetime

但是,如果你想要做它用纯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 
+0

不,我觉得在红宝石里做比mongoid快。因为我只需要从数据库中获取整个数据而不是多次访问数据库。我不认为mongo可以在早晨,晚上过滤条件:) – user3675188

+0

好吧我会更新我的解决方案以显示纯粹的红宝石方式:) –

1

假设datesetsJetstar对象的数组:

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)) 
相关问题