Версия с проверкой диапазона + необязательный блок для преобразования элементов в строку:
def enumerate_as_text(seq, max, &block)
text = seq.first(max).map { |itm|
block_given? ? yield(itm) : itm.to_s
}.join(", ")
text += ", and #{seq.length - max} more" if max < seq.length
text
end
Тестовый прогон:
blob = %w{a b c d e f g h i j}
puts blob.length
puts blob.join(", ")
puts enumerate_as_text(blob, 1)
puts enumerate_as_text(blob, 4)
puts enumerate_as_text(blob, 9)
puts enumerate_as_text(blob, 10)
puts enumerate_as_text(blob, 11)
puts enumerate_as_text(blob, 20) { |itm| "itm: #{itm}" }
Вывод:
10
a, b, c, d, e, f, g, h, i, j
a, and 9 more
a, b, c, d, and 6 more
a, b, c, d, e, f, g, h, i, and 1 more
a, b, c, d, e, f, g, h, i, j
a, b, c, d, e, f, g, h, i, j
itm: a, itm: b, itm: c, itm: d, itm: e, itm: f, itm: g, itm: h, itm: i, itm: j