2016-01-13 76 views
0

我有一些工厂不太常见的问题。我有几个相互关联的模型。我创造了相当精细工厂创建整个“链条”只调用下面FactoryGirl - 覆盖深层相关对象属性

FactoryGirl.create(:application) 

上面的命令就像我以前的几个相关的模型提到造成的。我使用Faker来填充属性的名称。一切正常,但我想用应用程序模型覆盖一个名为'service'的深层相关模型。我想过特质,但我不能在

trait :my_trait do 
    name 'Overwritten name' 
end 

FactoryGirl.create(:application, :my_trait) 

显然上面是错误的,因为对于特质对应用程序,而不是嵌套的服务模式援引特质。我发现的一个解决方案是在创建工厂后进行更新,但我更愿意在全球范围内进行更多操作。

回答

1

在这些情况下,我们通常会创建一个单独的“较低”实例并将其传递给“较高”实例。

像:

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 
+0

应用程序没有一个服务,它通过像我刚才提到的几个模型相关。这只是我的问题。 – mike927

+0

然后您需要创建“中间”实例或使用第二个示例。 –

+0

回调和忽略这是我正在寻找!非常感谢 :) – mike927