2012-05-03 3 views
24

में एसोसिएशन पर विशेषता सेट करने में पास पैरामीटर पास करें, मैं एक कारखाने में पैरामीटर पास करना चाहता हूं जिसका उपयोग किसी संबंधित मॉडल पर विशेषता सेट करने के लिए किया जाएगा। संबंधित मॉडल कारखाने के भीतर बनाया गया है।फैक्टरीगर्ल

मेरे पास एक एक्सचेंज टेबल TxLink के माध्यम से स्वयं से कई सारे लिंक के साथ एक लेनदेन मॉडल है। मैं link = FactoryGirl.create(:link_red_to_sub, sub: 10, red: 7) पर कॉल करना चाहता हूं जो दो लेनदेन ऑब्जेक्ट्स और एक टीएक्सलिंक बनाएगा जो दोनों को लिंक करता है।

मुझे अंत में units: sub की वजह से नीचे एसोसिएशन लाइन में एक त्रुटि मिलती है। त्रुटि "विशेषता परिभाषित नहीं है"। मैंने units: { sub } (ब्रैकेट के साथ) की बजाय कोशिश की लेकिन कोई पासा नहीं।

factory :tx_link do 
    units "9.99" 

    factory :link_red_to_sub do 
     ignore do 
     sub 0 
     red 0 
     end 
     units { red } 

     association :giver, factory: :transaction, units: sub 
     association :taker, factory: :redemption, units: red 
    end 
    end 

उत्तर

33

factory_girl में association सहायक गतिशील संपत्ति तर्क नहीं ले जा सकते हैं, लेकिन आप संघ का दृष्टांत को एक गतिशील विशेषता का उपयोग कर सकते हैं लेकिन आप चाहते हैं:

factory :tx_link do 
    units "9.99" 

    factory :link_red_to_sub do 
    transient do 
     sub 0 
     red 0 
    end 
    units { red } 

    giver { create(:transaction, units: sub) } 
    taker { create(:redemption, units: red) } 
    end 
end 

इस का केवल नकारात्मक पक्ष यह है कि है giver और taker एसोसिएशन tx_link के साथ कौन सी रणनीति बना रहे हैं, इस पर ध्यान दिए बिना निर्माण रणनीति का उपयोग करेंगे, जिसका अनिवार्य रूप से मतलब है कि attributes_for और build_stubbedtx_link फैक्ट्री के लिए सही तरीके से काम नहीं करेगा।

मेरे द्वारा प्रदान किया गया उदाहरण संस्करण 4.5.0 की आवश्यकता है।

+0

उपेक्षा मान्य नहीं है। इसके बजाय, हमें "क्षणिक" – hcarreras

23

जो जवाब में विस्तार करते हुए निर्माण और बनाने के बीच भेदभाव की अनुमति के लिए:

factory :tx_link do 
    units "9.99" 

    factory :link_red_to_sub do 
    ignore do 
     sub 0 
     red 0 
    end 
    units { red } 

    giver { build(:transaction, units: sub) } 
    taker { build(:redemption, units: red) } 

    after(:create) do |link_red_to_sub| 
     link_red_to_sub.giver.save! 
     link_red_to_sub.taker.save! 
    end 
    end 
end