Прежде всего, ваш метод может быть немного упрощен с Array#flatten
:
>> options.split(',').map{|x|x.split 'or'}.flatten.map(&:strip).reject(&:empty?)
=> ["Cake", "pie", "ice cream", "pudding"]
Я бы предпочел использовать одно регулярное выражение:
>> options.split /\s*, or\s+|\s*,\s*|\s+or\s+/
=> ["Cake", "pie", "ice cream", "pudding"]
Вы можете использовать |
в регулярном выражении, чтобы указать альтернативы, а , or
сначала гарантирует, что он не произведет пустой элемент. Захват пробелов с помощью регулярных выражений, вероятно, лучше всего подходит для эффективности, поскольку вам не нужно снова сканировать массив.
Как отмечает Забба, вы все еще можете отказаться от пустых элементов, предлагая следующее решение:
>> options.split(/,|\sor\s/).map(&:strip).reject(&:empty?)
=> ["Cake", "pie", "ice cream", "pudding"]