Compte tenu de ce qui suit
class User < ActiveRecord::Base
has_and_belongs_to_many :companies
end
class Company < ActiveRecord::Base
has_and_belongs_to_many :users
end
comment définissez-vous les usines pour les entreprises et les utilisateurs, y compris l'association bidirectionnelle? Voici ma tentative
Factory.define :company do |f|
f.users{ |users| [users.association :company]}
end
Factory.define :user do |f|
f.companies{ |companies| [companies.association :user]}
end
maintenant j'essaye
Factory :user
Sans surprise, cela se traduit peut-être par une boucle infinie, car les usines s'utilisent réciproquement pour se définir.
Plus surprenant, je n'ai trouvé aucune mention de la façon de faire cela nulle part, y a-t-il un modèle pour définir les usines nécessaires ou je fais quelque chose de fondamentalement mal?
Factorygirl a depuis été mis à jour et inclut désormais des rappels pour résoudre ce problème. Jetez un œil à http://robots.thoughtbot.com/post/254496652/aint-no-calla-back-girl pour plus d'informations.
la source
after(:create)
au lieu deafter_create
fille d'usine comme mentionné ici: stackoverflow.com/questions/15003968/...À mon avis, il suffit de créer deux usines différentes comme:
Lorsque vous écrivez les cas de test pour l'utilisateur, écrivez simplement comme ceci
J'espère que cela fonctionnera.
la source
Je n'ai pas pu trouver d'exemple pour le cas mentionné ci-dessus sur le site Web fourni. (Seulement 1: N et associations polymorphes, mais pas d'habtm). J'ai eu un cas similaire et mon code ressemble à ceci:
la source
Ce qui a fonctionné pour moi, c'est la création de l'association lors de l'utilisation de l'usine. En utilisant votre exemple:
la source
Trouvé de cette façon agréable et verbeux:
la source
foos { |a| [a.association(:foo)] }
m'aide beaucoup! Je vous remercie!Avertissement: Remplacez les utilisateurs: [utilisateur] par: utilisateurs => [utilisateur] pour ruby 1.8.x
la source
after_create { |company, evaluator| FactoryGirl.create_list(:user, evaluator.users_count, companies: [company]) }
:?Tout d'abord, je vous encourage fortement à utiliser has_many: through au lieu de habtm (plus à ce sujet ici ), vous vous retrouverez donc avec quelque chose comme:
Après cela, vous aurez une association has_many des deux côtés et pourrez leur attribuer dans factory_girl comme vous l'avez fait.
la source
Employment belongs_to :user
etEmployment belongs_to :company
avec le modèle de jointure connectant une entreprise à un utilisateur?Mise à jour pour Rails 5:
Au lieu d'utiliser l'
has_and_belongs_to_many
association, vous devriez considérer:has_many :through
association.La fabrique d'utilisateurs pour cette association ressemble à ceci:
Vous pouvez créer l'usine d'entreprise de la même manière.
Une fois les deux usines définies, vous pouvez créer une
user_with_companies
usine aveccompanies_count option
. Ici, vous pouvez spécifier le nombre d'entreprises auxquelles appartient l'utilisateur:create(:user_with_companies, companies_count: 15)
Vous pouvez trouver des explications détaillées sur les associations de filles d'usine ici .
la source
Pour HABTM, j'ai utilisé des traits et des rappels .
Supposons que vous ayez les modèles suivants:
Vous pouvez définir l'usine ci - dessus :
la source
Vous pouvez définir une nouvelle fabrique et utiliser après le rappel (: create) pour créer une liste d'associations. Voyons comment le faire dans cet exemple:
L'attribut companies_count est un transitoire et disponible dans les attributs de la fabrique et dans le callback via l'évaluateur. Désormais, vous pouvez créer un utilisateur avec des entreprises avec la possibilité de spécifier le nombre d'entreprises que vous souhaitez:
la source