В 1.9 это можно сделать довольно чисто:
>> 8.times.map { [*?a..?z,*?A..?Z].sample }.join #=> "kmQQvuPd"
Символы будут повторяться, как показано в этом примере с меньшим диапазоном символов:
>> 8.times.map { [*?a..?c,*?A..?C].sample }.join #=> "CaACAaBa"
Возможно, вы хотитехранить массив букв в отдельной переменной:
>> letters = [*?a..?z,*?A..?Z] #=> ["A", "B", "C", ...]
>> 8.times.map { letters.sample }.join #=> "HBKKbnzx"