2

在我的模型,我有以下設置:如何使用Factory Girl中的has_many:through關係創建關聯?

class User < ActiveRecord::Base 
    has_many :assignments 
    has_many :roles, :through => :assignments 
end 


class Role < ActiveRecord::Base 
    has_many :assignments 
    has_many :users, :through => :assignments 
end 

class Assignment < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :role 

    attr_accessible :role_id, :user_id 
end 

在我factory.rb文件我有:

FactoryGirl.define do 
    factory :user do 
    sequence(:username) { |n| "user#{n}" } 
    email { "#{username}@example.com" } 
    password 'secret' 
    password_confirmation 'secret' 

    factory :admin do 
     ... 
    end 
    end 

    factory :role do 
    name 'Normal' 
    value 'normal' 
    end 

    factory :assignment do 
    ... 
    end 
end 

我竭力要弄清楚如何我想補充着,一個角色:名稱=>「管理」,:值=>「管理」,「用戶」塊裏面的「admin」的工廠,所以我可以叫

create(:admin) 
在我的測試中

,並與管理員角色的用戶。

謝謝你的期待。

回答

5

對於這樣的工廠,您需要使用工廠女孩的回調。 試試這個:

FactoryGirl.define do 
    factory :user do 
    ... 
    end 

    factory :admin, :parent => :user do 
    after_create {|u| Factory(:assignment, :role => Factory(:role, :name => 'admin', :value => 'admin'), :user => u)} 
    end 

    factory :role do 
    ... 
    end 

    factory :assignment do 
    user {|a| a.association(:user)} 
    role {|a| a.association(:role)} 
    end 
end 
+0

下面是我用來幫助我建立協會與回調的鏈接:http://robots.thoughtbot.com/post/254496652/aint-no-calla-back-girl – Nick

3

@kshil是正確的,但你可以收緊的代碼一點,變得更加模塊化。

爲管理員用戶創建第二個:role工廠。

factory :role do 
    name 'Normal' 
    value 'normal' 

    factory :admin_role do 
    name 'admin' 
    value 'admin' 
    end 
end 

此外,如果工廠名稱與關聯名稱相同,則可以省略工廠名稱。該:assignment工廠變爲:

factory :assignment do 
    user 
    role 
end 

定義:admin_user工廠:user工廠內,你沒有指定父工廠。您也可能會添加兩個工廠來定義普通用戶和管理員用戶。

factory :user do 
    sequence(:username) { |n| "user#{n}" } 
    email { "#{username}@example.com" } 
    password 'secret' 
    password_confirmation 'secret' 

    factory :normal_user do 
    after_create {|u| Factory(:assignment, :user => u)} 
    end 

    factory :admin_user do 
    after_create {|u| Factory(:assignment, :role => Factory(:admin_role), :user => u)} 
    end 
end 
+0

我有一個小的疑難雜症有了這個。在:admin_user工廠中,我不得不放置以下內容:after_create {| u |工廠(:分配,:角色=>工廠(:admin_role),:用戶=>ü)}否則我會得到一個意外的符號錯誤。 – jklina

+0

謝謝你的擡頭。我已經更新了答案。 – nmott

相關問題