2010-07-14 14 views
5

Tengo una restricción y una validación en el campo guid para que cada una sea única. El problema es que, con la definición de fábrica que tengo a continuación, puedo crear solo una instancia de usuario, ya que las instancias adicionales no validan.Creando instancias con atributos únicos usando Factory Girl

¿Cómo hago esto correctamente para que el campo guid sea siempre único?

Factory.define(:user) do |u| 
    u.guid UUIDTools::UUID.timestamp_create.to_s 
end 

Respuesta

10

En general, Factory Girl aborda el problema con las secuencias:

Factory.define(:user) do |u| 
    u.sequence(:guid) { |n| "key_#{n}" } 
end 

Asumo, sin embargo, que no quiere tener algo parecido, pero iterador una marca de tiempo. Esto se podría hacer uso de los atributos lazy (que evalúan en tiempo de ejecución):

Factory.define(:user) do |u| 
    u.guid { Time.now.to_s } 
end 

O, suponiendo que UUIDTools :: UUID.timestamp_create genera una marca de tiempo (esperemos formato adecuado):

Factory.define(:user) do |u| 
    u.guid { UUIDTools::UUID.timestamp_create.to_s } 
end 
+2

+1 El La razón por la cual el OP está teniendo el problema es porque el código de creación de guía se evalúa en el tiempo de definición de fábrica, por lo que el valor es constante para cada invocación de la fábrica. La tercera de sus tres soluciones posibles generará un nuevo GUID en cada invocación de la fábrica, que es casi seguro lo que el OP está buscando. –

Cuestiones relacionadas