Considérez cette usine :
# Read about factories at http://github.com/thoughtbot/factory_girl
FactoryGirl.define do
factory :follow_up do
first_name { Faker::Name.first_name }
last_name { Faker::Name.last_name }
phone { Faker::PhoneNumber.cell_phone.gsub(/[^\d]/, '').gsub(/^1/, '2')[0..9] }
email { Faker::Internet.email }
email_preferred true
consent false
trait :by_referral do
association :hospital
association :referral
source { FollowUp::REFERRAL}
end
trait :by_provider do
association :provider
source { FollowUp::PROVIDER }
end
end
end
Je veux soit inclure par défaut le trait by_referral, soit le trait by_provider. Il ne devrait pas être valide si aucun des traits n'est inclus. Est-ce possible, ou y a-t-il une meilleure façon de le faire?
Il n'y a aucun moyen direct de fermer une usine ou de forcer l'inclusion d'un trait, mais qu'en est-il de quelque chose comme ça ?
trait :follow_up_defaults do
first_name {}
last_name {}
# ...
end
factory :follow_up_from_referral, class: FollowUp do
follow_up_defaults
hospital
referral
source { FollowUp::REFERRAL }
end
factory :follow_up_from_provider, class: FollowUp do
follow_up_defaults
provider
source { FollowUp::PROVIDER }
end
L'autre moyen serait d'inclure un trait dans une usine par défaut :
factory :follow_up do
first_name {}
last_name {}
# ...
by_referral # <== defaults to by_referral
trait :by_referral do
# ...
end
trait :by_provider do
# ...
end
Le problème potentiel ici est que l'association du trait de base sera toujours incluse, même si techniquement, elle ne devrait pas l'être. La première solution (tout en étant un peu bizarre) garantit qu'un suivi tombe toujours dans l'une des deux catégories.
Faites-moi savoir si quelque chose n'est pas clair ou si vous avez d'autres idées pour résoudre ce problème !
Il s'avère que je peux jeter une instruction if dans une usine, donc cela fonctionne :
# Read about factories at http://github.com/thoughtbot/factory_girl
FactoryGirl.define do
factory :follow_up do
first_name { Faker::Name.first_name }
last_name { Faker::Name.last_name }
phone { Faker::PhoneNumber.cell_phone.gsub(/[^\d]/, '').gsub(/^1/, '2')[0..9] }
email { Faker::Internet.email }
email_preferred true
consent false
if [1, 2].sample == 1
by_referral
else
by_provider
end
trait :by_referral do
association :hospital
association :referral
source { FollowUp::REFERRAL}
end
trait :by_provider do
association :provider
source { FollowUp::PROVIDER }
end
end
end
Merci @joshuaclayton
Au cas où quelqu'un d'autre rencontrerait le même problème que moi, vous ne pouvez pas avoir un trait par défaut qui porte le même nom qu'une usine existante. Voir https://github.com/alphagov/content-publisher/pull/1568#discussion_r362202799 pour le contexte complet.
À la place de
image
trait :image do
# etc
end
... J'ai dû renommer en :
for_image
trait :for_image do
# etc
end
...comme j'avais déjà une usine :image
ailleurs dans le référentiel.
Cette nuance est capturée dans le guide de démarrage : "Notez que définir des traits comme attributs implicites ne fonctionnera pas si vous avez une usine ou une séquence avec le même nom que le trait" - mais il est facile de rater si vous survolez.
Commentaire le plus utile
Il n'y a aucun moyen direct de fermer une usine ou de forcer l'inclusion d'un trait, mais qu'en est-il de quelque chose comme ça ?
L'autre moyen serait d'inclure un trait dans une usine par défaut :
Le problème potentiel ici est que l'association du trait de base sera toujours incluse, même si techniquement, elle ne devrait pas l'être. La première solution (tout en étant un peu bizarre) garantit qu'un suivi tombe toujours dans l'une des deux catégories.
Faites-moi savoir si quelque chose n'est pas clair ou si vous avez d'autres idées pour résoudre ce problème !