Если вы хотите сделать это вручную, без использования каких-либо драгоценных камней, должно сработать что-то вроде следующего, хотя это выглядит немного глупо.
versions = [ '0.10', '0.2.1', '0.4' ]
versions.map{ |v| (v.split '.').collect(&:to_i) }.max.join '.'
По сути, вы превращаете каждую строку версии в массив целых чисел, а затем используете оператор сравнения массивов . Вы можете разбить шаги компонента, чтобы получить что-то более легкое для выполнения, если это происходит в коде, который кто-то должен будет поддерживать.