Вы можете использовать Array # product method:
x = [ ['0', "#0"], ['1', "#1"] ]
#=> [["0", "#0"], ["1", "#1"]]
y = [ ['00', "00 description"], ['10', "10 description"] ]
#=> [["00", "00 description"], ["10", "10 description"]]
x.product(y).map{|a1,a2| [a1[0]+a2[0], a1[1] + ' ' + a2[1]]}
#=> [["000", "#0 00 description"], ["010", "#0 10 description"], ["100", "#1 00 description"], ["110", "#1 10 description"]]
И если вам не нужны различные виды конкатенации выше (вторая вставка пробела между ними), даже:
x.product(y).map{|a1,a2|
a1.zip(a2).map{|e|
e.inject(&:+)
}
}
А вот вариант без Array#product
, по общему признанию менее читабельный:
x.inject([]){|a,xe|
a + y.map{|ye|
xe.zip(ye).map{|e|
e.inject(&:+)
}
}
}