1
FactoryGirl.define do 

factory :agency do 
    name "Example Inc" 
    available_items "20" 
    recruiter  # recruiter.id 
end 

factory :recruiter do 
    email '[email protected]' 
    password 'please' 
    password_confirmation 'please' 
    # required if the Devise Confirmable module is used 
    # confirmed_at Time.now 
end 

end 

agency.rbFactory_girl两款车型之间的简单关联

class Agency < ActiveRecord::Base 
    belongs_to :recruiter 
    validates :name, :presence => true 
end 

recruiter.rb

class Recruiter < ActiveRecord::Base 
    devise :database_authenticatable, :registerable, 
    :recoverable, :rememberable, :trackable, :validatable 

    # Setup accessible (or protected) attributes for your model 
    attr_accessible :email, :password, :password_confirmation, :remember_me 
    attr_accessible :agency_attributes, :first_name 

    has_one :agency, :dependent => :destroy 

    accepts_nested_attributes_for :agency 
    validates :email, :presence => true 
end 

authentication_steps.rb

def create_user 
    @recruiter = FactoryGirl.create(:recruiter) 
end 

如何使用factory_girl复制此招聘人员&机构关联?

+0

如果代理机构'belongs_to:招聘人员',那么您只能为每个代理机构申请一个招聘人员,并且您的代理机构表中有一个招聘人员ID。那是你要的吗?我期望看到机构'has_many:招聘人员'和招聘人'belongs_to:agency'。 – 2012-04-24 17:35:43

回答

4

我想你应该从代理工厂招聘删除,并添加机构requiter工厂

FactoryGirl.define do 

    factory :agency do 
    name "Example Inc" 
    available_items "20" 

    factory :agency_without_recuiter do 
     recuiter_id = 1 
    end 

    factory :agency_with_recuiter do 
     recuiter 
    end 
    end 

    factory :recuiter do 
    email '[email protected]' 
    password 'please' 
    password_confirmation 'please' 

    factory :recuiter_with_agency 
     agency 
    end 
    end 

end 

这应该由双方

create(:agency).recuiter => nil 
create(:agency_with_recuiter).recuiter => recuiter 

create(:recuiter).agency => nil 
create(:recuiter_with_agency).agency => agency 

希望这将是有用的。祝你好运!

+0

如果代理机构有招聘人员,那就意味着他们有一个招聘人员ID,除非允许为零,那么代理机构工厂应该制作一个招聘对象,然后它可以指向它。 – MrDanA 2012-04-24 17:31:34

+0

好的我明白,但你没有agency.recuiter_id验证。你可以在工厂设置假recuiter_id,这样你就可以拥有独立的代理工厂。但我不确定这是否是一种好的做法。 – Suborx 2012-04-24 17:42:23

1

我认为你必须在你的测试用例中复制它,而不是在FG本身。

before (:each) do 
    @recruiter = FactoryGirl.create(:recruiter) 
    @agency = FactoryGirl.create(:agency) 
    @agency.recruiter = @recruiter 
end 

这样的事情。