2013-12-21 54 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类)是一个可靠的实践,我建议寻找另一种方式来解决这个问题)