2013-08-26 45 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