2013-10-31 142 views
0

我正在尋找一個舒適的方式來創建一個recoursive工廠。 在我的應用程序用戶有很多軟件,我想創建一個「一槍」用戶與n相關的軟件。 這是我的代碼:工廠女孩回憶工廠

FactoryGirl.define do 
factory :user do |f| 
    f.sequence(:username) { |n| "user#{n}" } 
end 

trait :with_software do 
    ignore do 
     n 3 
    end 

after :create do |user, evaluator| 
    FactoryGirl.create_list :software, evaluator.n, :user => user 
end 

,而軟件的定義如下

factory :software do |f| 
    f.sequence(:name) { |n| "software#{n}" } 
    f.association :user 
end 

當我位數:

user1 = FactoryGirl.create(:user, :with_software) 

FactoryGirls創建了3個相關的軟件項目的用戶。問題是軟件名稱始終是「軟件#{n}」。 如何指定一個唯一的軟件名稱:user.name +「software#{n}」?

回答

0

首先你所談論的並不是遞歸的,但那並不重要。

你可以達到你想要通過以下的內容:

 

factory :software do |f| 
    f.sequence(:name) { |n| "software#{n}" } 
    f.association :user 

    trait :with_matching_name do 
     f.name { "#{f.user.name}#{f.name}" } 
    end 
end 

factory :user do |f| 
    f.sequence(:username) { |n| "user#{n}" } 

    trait :with_software do 
     ignore do 
      n 3 
     end 
    end 

    after :create do |user, evaluator| 
     FactoryGirl.create_list :software, evaluator.n, :user => user, :with_matching_name 
    end 
    end 

你可以試試,如果它的工作原理。

+0

我從create_list收到以下錯誤:語法錯誤,意外的'\ n',期待tASSOC。它令我瘋狂 –

+0

它似乎不喜歡create_list中的行結尾,並且希望看到「=>」。您也可以嘗試在不使用create_list時發生的情況,但是使用n次然後FactoryGirl.create .. – Kristiina

+0

相同的錯誤:語法錯誤,意外的'\ n',期待tASSOC(SyntaxError)。錯誤與:with_matching_name選項有關。感謝您的可評估幫助 –