【问题标题】:Sorting data by time with custom start time使用自定义开始时间按时间排序数据
【发布时间】:2020-02-01 21:20:54
【问题描述】:

我正在使用 Rails 构建一个时间表应用程序,我需要按时间排序一些记录,但是我希望开始时间是 05:00 而不是 00:00

我的查询如下所示:

@timetable_entries.order(departure_time: :asc)

结果:

00:30
03:30
05:30
...

但是我希望我的一天从早上 5 点开始,因此生成的数据应该如下所示:

05:30
00:30
03:30

有人知道这样做的干净方法吗?

提前致谢。

【问题讨论】:

  • 这是否意味着您需要在第二天之前进行排序? e.i: 05:30 -> 2019/03/10 00:30 -> 2019/03/11
  • departure_time 列的数据类型是什么?

标签: ruby activerecord ruby-on-rails-5


【解决方案1】:

最简单的方法可能是编写自己的比较器。 ruby sort 方法可以使用一个块 (documentation here),允许您使用自定义比较方法进行排序。您可以使用该方法指示 5:00 早于 0:00 到 4:59 之间的所有时间。

代码如下所示:

@timetable_entries.sort do |time1, time2|
  # your custom comparison here
end

【讨论】:

  • 好主意,但您需要包含与05:30 开始时间相对应的块。
【解决方案2】:
arr = %w| 00:30 03:30 00:01, 05:30 10:20 02:10 14:05 19:06 |
  #=> ["00:30", "03:30", "00:01,", "05:30", "10:20", "02:10", "14:05", "19:06"] 

sorted = arr.sort
  #=> ["00:01,", "00:30", "02:10", "03:30", "05:30", "10:20", "14:05", "19:06"] 
idx = sorted.find_index { |s| (s <=> '05:30') >= 0 }
  #=> 4  
sorted.rotate(idx)
  #=> ["05:30", "10:20", "14:05", "19:06", "00:01,", "00:30", "02:10", "03:30"] 

请参阅Array#find_indexString#<=>Array#rotate

接下来是另一种方式。

arr.sort_by { |s| (s <=> '05:30') == -1 ? "#{s[0,2].to_i+24}:#{s[2,3]}" : s }

如果s = '02:10'

s <=> '05:30'  #=> -1
a = s[0,2]     #=> "02" 
b = a.to_i     #=> 2 
c = b+24       #=> 26 
d = s[2,3]     #=> ":10" 
"#{c}:#{d}"    #=> "26::10"

Enumerable#sort_by

【讨论】:

  • 看起来 OP 正在尝试使用 ActiveRecord 的 order 子句对数据库记录进行排序,而不是尝试对普通的 Ruby 数组进行排序。
  • @Jordan,我明白你的意思了。如果我知道ActiveRecord,我会翻译我的答案,但我不知道。也许我的回答对希望发布使用ActiveRecord 的答案的人有用。
猜你喜欢
  • 1970-01-01
  • 2012-04-07
  • 1970-01-01
  • 2022-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-24
  • 1970-01-01
相关资源
最近更新 更多