Вы можете превратить объекты в массивы для сравнения
[p1.foo, p1.bar, p1.moo, p1.sam.moo] <=> [p2.foo, p2.bar, p2.moo, p2.sam.moo]
Массивы сравниваются как строки: по первому отличающемуся элементу.
Если в некоторых сравнениях (p2.bar <=> p1.bar
) обратные индексы не являются опечатками, вам также придется переключать элементы массива.
Или вы можете переопределить оператор сравнения в вашем классе
def <=>(p2)
...
end
В этом случае вам не нужно ничего передавать в items.sort!
.