Из документации:
Аргумент n указывает длину случайной длины. Длина строки результата в два раза больше n.
Итак, если вы хотите 45, вы можете установить его на 23, который вернет 46 символов, а затем возьмет первые 45. Конечно, сработает и первые 45 символов более длинной строки.
ActiveSupport::SecureRandom.hex(23)[0...45]