2010-07-14 4 views
5

J'ai une contrainte et une validation placées sur le champ guid afin que chacune soit unique. Le problème est qu'avec la définition d'usine ci-dessous, je ne peux créer qu'une seule instance d'utilisateur, car des instances supplémentaires échouent à la validation.Création d'instances avec des attributs uniques à l'aide de Factory Girl

Comment procéder correctement pour que le champ guid soit toujours unique?

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

Répondre

10

En général, les adresses Factory Girl le problème avec des séquences:

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

Je suppose, cependant, que vous ne voulez pas avoir comme iterator quelque chose, mais un horodatage. Cela pourrait se faire en utilisant les attributs paresseux (qui évaluent à l'exécution):

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

Ou, en supposant que UUIDTools :: UUID.timestamp_create génère un horodatage (je l'espère convenablement formaté):

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

+1 Le La raison pour laquelle le PO rencontre le problème est que le code de création de guid est évalué à l'heure de la définition d'usine, de sorte que la valeur est constante pour chaque invocation de l'usine. La troisième de vos trois solutions possibles génèrera un nouveau GUID à chaque invocation de l'usine, ce qui est presque certainement ce que le PO recherche. –

Questions connexes