Нет ничего похожего на одну строку:)
str.reverse.split('-', 2).collect(&:reverse).reverse
Он перевернет строку, разделив ее на '-', и, таким образом, вернет 2 элемента (материал перед первым '-' и все, что за ним следует), прежде чем перевернуть оба элемента и затем сам массив.
Редактировать
*before, after = str.split('-')
puts [before.join('-'), after]