2013-12-21 53 views
0

我只是不知道他們是爲了什麼。之前我認爲他們很容易填充外鍵,但現在我發現情況並非如此。嵌套工廠的要點是什麼?

# User attributes: id, name, password 
factory :user_0, class: User do 
    id 0 
    name "Jimmy" 
    password "Jimson" 
end 

# Status attributes: id, user_id, content 
factory :user_0_statuses, class: Status do 
    association :user, factory: :user_0 

    factory :user_0_status_0 do 
     id 0 
     content "noo" 
    end 
    factory :user_0_status_1 do 
     id 1 
     content "yees" 
    end 
end 

當:user_0_status_0和:user_0_status_1工廠都在一個規範.create d,我認爲這個工廠設置將在數據庫中創建以下(注意狀態user_id說明項):

users  
id | name | password 
0 | Jimmy | Jimson 

statuses 
id | user_id | content 
0 | 0  | noo 
1 | 0  | yees 

但相反,它會創建這樣的:

users  
id | name | password 
0 | Jimmy | Jimson 
0 | Jimmy | Jimson 

statuses 
id | user_id | content 
0 | nil  | noo 
1 | nil  | yees 

基本上,每一個嵌套的狀態工廠創建的基礎上,USER_0工廠一個全新的用戶,並且用戶_狀態的ID根本沒有設置。這種行爲如何有用?

我根本看不到任何有關嵌套工廠的用法。它們是什麼以及關聯方法?

+0

請使用有意義的變量名稱而不是'user_0_something',很難知道你的意圖。 –

+0

我沒有測試任何東西,所有我關心的問題是嵌套表對創建的過渡數據庫條目的影響。 – Starkers

+0

我知道你沒有測試某些東西。我很難用這些變量名來理解這個問題,我不知道它們是什麼。 –

回答

0

當工廠嵌套在另一個工廠定義中時,它將繼承在父工廠中定義的屬性。如果你有一個用戶工廠,你可以在其中嵌入一個「admin_user」工廠,它具有所有的基本用戶特性,以及使用戶成爲管理員的任何東西,而不必重新定義兩次基本屬性。

(略無關:我不知道,如果設置主鍵(狀態爲一個ActiveRecord類)是一個可靠的實踐,我建議尋找另一種方式來解決這個問題)