Ruby sort_by дважды

Ruby имеет метод sort_by для Enumerables. Фантастика! Таким образом, вы можете сделать что-то вроде

entries.sort_by { |l| l.project.name }

Это будет сортировать кучу записей по именам их проектов. Как вы могли бы работать так, чтобы в проектах с одинаковым именем записи сортировались по времени?

Ответ 1

Я бы предложил поместить столбец, который вы хотите отсортировать, в массив.

entries.sort_by { |l| [l.project.name, l.project.time] }

Это будет учитывать порядок естественного сортировки для каждого типа.

Ответ 2

Для этого вы можете использовать обычный метод сортировки.

entries.sort do |a, b|
  comp = a.project.name <=> b.project.name
  comp.zero? ? (a.project.time <=> b.project.time) : comp
end

Ответ 3

Возвращает массив:

entries.sort_by { |l| [ l.project.name, l.project.time] }

это работает, потому что оператор <=> на массивах выполняет полевое "лексическое" сравнение, которое вы ищете.