2010-08-07 2 views
2

Y a-t-il un moyen dans factory_girl de spécifier une instance aléatoire vers laquelle une association doit pointer? Par exemple, j'ai un objet Like qui belongs_to un User et un SocialUnit. Je veux l'usine pour Like pour choisir un User aléatoire aléatoire et un SocialUnit au hasard, au lieu de simplement en générer un nouveau. L'extrait ci-dessous fonctionne en quelque sorte:Spécification d'un objet d'association aléatoire dans la définition factory_girl

Factory.define :like do |f| 
    if User.all.count > 0 
    f.user User.all.sort_by{ rand }.first 
    else 
    f.association :user 
    end 
end 

Il prend en effet un utilisateur au hasard, mais il semble que l'utilisateur aléatoire n'est ramassé une fois, parce que l'exécution de ce

def create_hauls 
    5.times do |i| 
    Factory(:haul) 
    end 
end 

crée un tas de gens tout avec le même utilisateur. Je suppose que cela a du sens ... l'usine est définie une fois, puis réutilisée plusieurs fois.

Je pourrais utiliser une séquence pour forcer l'aléatoire; existe-t-il un moyen de le définir dans la définition d'usine, ou la séquence est-elle la meilleure façon de le faire?

Merci.

Répondre

7

Vous souhaitez utiliser un lazy attribute au lieu de définir l'utilisateur lorsque l'usine est définie. Ceci définira l'utilisateur chaque fois que l'usine est utilisée à la place.

f.user { (User.all.count > 0 ? User.all.sort_by{ rand }.first : Factory.create(:user)) }

+0

ah, merci. j'avais implémenté une solution avec une séquence (en remplaçant 'if User.all.count> 0' dans mon extrait avec' Factory.next (: random_user) ', mais en y repensant, c'était faux car il allait encore vérifier si' User.all.count> 0' qu'une seule fois. Merci pour l'aide! – unsorted

Questions connexes