2013-08-26 16 views
0

我有三种型号:用户,产品和所有权。所有权属于用户和产品。产品和用户有很多所有权。改进相关型号的工厂

我创建了FactoryGirl宝石以下工厂:

factory :user do 
    sequence(:name) { |n| "Robot #{n}" } 
    sequence(:email) { |n| "numero#{n}@robots.com"} 
    association :location, factory: :location 
end 

factory :product do 
    sequence(:name) { |n| "Objet #{n}" } 
    association :location, factory: :location 
end 

factory :ownership do 
    association :user, factory: :user 
    association :product, factory: :product 
end 

我用它这样的:

let(:user) { FactoryGirl.create(:user) } 
let(:product) { FactoryGirl.create(:product) } 
let(:ownership) { FactoryGirl.create(:current_ownership, user: user, product: product) } 

但我想提高我的工厂,为了做到这一点:

let(:user) { FactoryGirl.create(:user) } 
let(:product) { FactoryGirl.create(:product, owner: user) } 

你有任何ide一个如何做到这一点?

回答

0

为此,您可以使用工厂女孩after_create回调:

FactoryGirl.define do 
    factory :product do 
    # ... 

    ignore do 
     owner nil 
    end 

    after :create do |product, ev| 
     if ev.owner 
     create :ownership, user: ev.owner, product: product 
     end 
    end 
    end 
end 

配置厂家如此这样,您可以通过所有者属性进去。忽略块确保这个属性不会被传递给对象的构造函数,但是你可以在工厂女孩的回调函数中使用它。

你可以找到更多关于工厂女孩回调here信息。

+0

谢谢!这是'之前:创造'还是'之后:创造'?什么是“ev”? –

+0

是的,我的错误,在你的情况下,它应该是'后:创造'。我在答案中纠正了它。 ev(回调的第二个参数)是工厂女孩传递回调的评估对象。它使您可以访问忽略的属性。 – jurglic