我对工厂有一些不太常见的问题。我有几个相互关联的模型。我创造了一个非常好的工厂,创造了整个"链#34;仅在
下面调用FactoryGirl.create(:application)
上面的命令就像我之前提到的几个相关模型一样。我使用Faker填充属性'名。一切正常,但是,我想覆盖一个名为“服务”的深度相关模型。与应用程序模型。我想到了特质,但我不能在
中调用这个特性trait :my_trait do
name 'Overwritten name'
end
FactoryGirl.create(:application, :my_trait)
显然上面是错误的,因为trait关注应用程序而不是嵌套服务模型。我找到的一个解决方案是在创建工厂后更新它,但我更愿意在全局范围内更新。
答案 0 :(得分:1)
在这些情况下,我们通常会创建一个单独的“lower”实例,并将其传递给“upper”实例。
像:
service = FactoryGirl.build(:service, name: 'Something else')
application = FactoryGirl.create(:application, service: service)
当然,如果您在代码库中使用以下工厂非常多地使用此模式,您也可以实现相同的行为:
factory :application do
transient do
service_name nil
end
association :service
after(:build) do |application, evaluator|
if evaluator.service_name
application.service.name = evaluator.service_name
end
end
end