Necesito generar secuencias de etiquetas que se parezcan a "ABC1" y "XYZ9", siempre tres letras seguidas de un solo dígito. Quiero que ambas partes de la etiqueta se incrementen lógicamente y que siempre tengan el formato y la longitud exactos.
Empecé con:
sequence(:code) { |n| "ABC#{n}" } Eso estuvo bien, pero después de la novena etiqueta ( ABC9 ) pasó a ( ABC10 ), violando mi formato y solo produciendo 10 (¿o 9?) valores.
Una solución rápida de usar la secuencia para las letras y codificar un dígito hace que mi problema de reinversión no ocurra para 26^3 => 17,576 instancias, lo que podría estar bien. Pero también quiero cierta variabilidad en el dígito. Un dígito aleatorio probablemente sería lo suficientemente bueno... pero quiero todos los valores disponibles.
Pensé en algunas formas algo torpes de construir la cadena a partir de una o dos secuencias para obtener valores completos que siempre coincidieran con el formato, pero parecían torpes.
¿Existe una forma elegante en FactoryBot de crear una cadena secuenciada con un segmento de letras de ancho fijo seguido de un segmento numérico de ancho fijo que produzca todos los valores posibles?
Solo rubí; sin rieles o lo que sea:
code = "AAA0" 20.times{ puts code.succ! }Resulta que la solución en una fábrica es sublimemente simple y elegante:
sequence(:code, 'AAA1')Esto produce la siguiente secuencia:
FactoryBot.build :code => #<Code code: "AAA1"> => #<Code code: "AAA2"> => #<Code code: "AAA3"> => #<Code code: "AAA4"> => #<Code code: "AAA5"> => #<Code code: "AAA6"> => #<Code code: "AAA7"> => #<Code code: "AAA8"> => #<Code code: "AAA9"> => #<Code code: "AAB0"> => #<Code code: "AAB1"> => #<Code code: "AAB2"> ... four hours later ... => #<Code code: "ZZY7"> => #<Code code: "ZZY8"> => #<Code code: "ZZY9"> => #<Code code: "ZZZ0"> => #<Code code: "ZZZ1"> => #<Code code: "ZZZ2"> => #<Code code: "ZZZ3"> => #<Code code: "ZZZ4"> => #<Code code: "ZZZ5"> => #<Code code: "ZZZ6"> => #<Code code: "ZZZ7"> => #<Code code: "ZZZ8"> => #<Code code: "ZZZ9"> => #<Code code: "AAAA0"> => #<Code code: "AAAA1">Para mis necesidades, no me preocupa el traspaso total después de 175.760 valores.
También vale la pena señalar que puede comenzar cada segmento donde lo desee. Esto funciona igual de bien:
sequence(:code, 'ABC9') FactoryBot.build :code => #<Code code: "ABC9"> => #<Code code: "ABD0"> => #<Code code: "ABD1">