Использовать Range.new:
Range.new("a","z")
=> "a".."z"
Range.new(-5,5)
=> -5..5
Если вы храните в кавычках цитаты, вы можете использовать eval для получения правильных диапазонов:
from = "'a'"
to = "'z'"
eval("Range.new(#{from},#{to})")
В противном случае вы можете использовать значение.to_i, чтобы выяснить, было ли это число или строка в varchar:
a = "x"
a = (a.to_i == 0 && a != "0") ? a : a.to_i
=> "x"
a = "5"
a = (a.to_i == 0 && a != "0") ? a : a.to_i
=> 5
Что, конечно, можно извлечь из метода:
def to_int_or_string(value)
return (value.to_i == 0 && value != "0") ? value : value.to_i
end
def to_range(from, to)
return Range.new(to_int_or_string(from), to_int_or_string(to))
end
Чтобы изменить диапазон,сначала нужно преобразовать его в массив:
Range.new("a","g").to_a.reverse
=> ["g", "f", "e", "d", "c", "b", "a"]