2012-10-18 33 views
2

我有種雞和雞蛋類型的問題。我有一個具有default_domain _id的isp模型,我需要爲我的測試填充。問題是域屬於ISP。所以我試圖找出如何建立工廠,以產生一個ISP基於當前工廠的FactoryGirl依賴對象

工廠/ isp.rb

FactoryGirl.define do 
    factory :isp do 
    sequence :name do |n| 
     "ISP" + n.to_s 
    end 
    end 
end 

工廠/ domain.rb

FactoryGirl.define do 
    factory :domain do 
    isp 
    account 
    sequence :dn do |n| 
     "foo-#{n}.com" 
    end 
    active :true 
    end 
end 

應用程序/模型/ ISP。 RB

class Isp < ActiveRecord::Base 
    has_many :domains 
    belongs_to :default_domain, class_name: 'Domain' 
end 

應用程序/模型/ domain.rb

class Domain < ActiveRecord::Base 
    belongs_to :isp 
    ... 
end 

我試過在工廠使用(:create)回調後,似乎只是創建循環引用。試圖用塊來懶洋洋地評估它。一樣。就在虧損,其中下一看還是什麼,我應該嘗試..

回答

0

看來你找到了一個解決方案。但是,如果要使用工廠創建default_domain屬性,請嘗試此操作。

首先,如果您更改domain工廠以使其不參考isp工廠,您將避免循環參考。

其次,在你的isp工廠的定義,你可以這樣做:

FactoryGirl.define do 
    factory :isp do 
    sequence(:name) {|n| "ISP#{n}" } 
    after_create do |isp| 
     isp.default_domain = Domain.find_by_dn("#{isp.name}.com") || 
     FactoryGirl.create(:domain, :dn => "#{isp.name}.com") 
     isp.save! 
    end 
    end 

這將讓你利用FactoryGirl爲Domain模型較爲複雜的屬性,如果你想定製從dn場在工廠外部,您可以使用瞬態屬性並在after_create鉤子中使用它們。