Сортировка данных по времени с настраиваемым временем начала - PullRequest
2 голосов
/ 03 октября 2019

Я создаю приложение расписания, используя Rails, и мне нужно упорядочить некоторые записи по времени, однако я хочу, чтобы время начала было 05:00, а не 00:00

Мой запрос выглядит следующим образом:

@timetable_entries.order (выезд_время:: asc)

результат:

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

однако я хочу, чтобы мой день начинался в 5 утра, поэтому результирующие данные должны выглядеть следующим образомэто:

05:30
00:30
03:30

Кто-нибудь знает чистый способ сделать это?

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 03 октября 2019
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_index , String # <=> и 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 .

0 голосов
/ 03 октября 2019

Самый простой способ сделать это - написать собственный компаратор. Метод ruby ​​sort может принимать блок (документация здесь ), который позволяет сортировать с использованием пользовательского метода сравнения. Вы можете использовать этот метод, чтобы указать, что 5:00 раньше, чем все с 0:00 до 4: 59.

Код будет выглядеть примерно так:

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