【问题标题】:How could I fitler array by time period(HHMM~HHMM) in Rails如何在 Rails 中按时间段(HHMM~HHMM)过滤数组
【发布时间】:2015-10-08 09:54:27
【问题描述】:

我通过 mongoid 得到了航班。

我怎样才能在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

整个日期集

[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

【问题讨论】:

  • 你尝试过哪些类型的东西?你到底被什么困住了?你能告诉我们你尝试过的代码吗?
  • 我只是在计划如何编写那种代码来挑选我想要的时间间隔。喜欢morning flight 06:00~09:00

标签: ruby-on-rails ruby ruby-on-rails-4 mongoid


【解决方案1】:

在 mongoid 中,您可以使用 between 来搜索范围内的记录。我不建议您直接在 Ruby 中进行过滤,因为对于较大的数据集,这会很慢并且会占用大量内存。

这篇文章通过一个解决方案:

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

但是,如果你想用纯红宝石来做,你可以这样做:

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

【讨论】:

  • 不,我认为在 ruby​​ 中执行此操作比在 mongoid 中要快。因为我只需要从数据库中获取整个数据而不是多次访问数据库。我不认为 mongo 可以在早上和晚上过滤条件:)
  • 好的,我将更新我的解决方案以显示纯红宝石方式:)
【解决方案2】:

假设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))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-21
    • 2020-06-05
    • 2018-01-29
    • 2022-01-24
    相关资源
    最近更新 更多