Я бы использовал карту, чтобы запустить все через proc_for, а затем объединить процессы с помощью inject.
def to_proc
@fields.zip(@orderings).map do |field, ordering|
proc_for(field, ordering)
end.inject do |prev,curr|
prev.decorate_w_secondary_sorting_level curr
end
end
Это заставляет методы итератора выполнять управление потоком за вас, избегая ложных нулей и операторов if.