2015-12-01 8 views
6

में पैरा के साथ किसी अन्य विशेषता से कॉल विशेषता का पता लगाएं मेरे पास एक काफी चंचल फैक्ट्री गर्ल विशेषता है जो पैरा को स्वीकार करती है और एक has_many संबंध बनाता है। मैं लक्षणों को सूखने के लिए किसी अन्य विशेषता के हिस्से के रूप में उस विशेषता को कॉल कर सकता हूं या कारखानों में उन्हें पारित करते समय एक साथ गुणों को बंडल करना आसान बनाता हूं। मुझे नहीं पता कि कैसे करना है, जब मैं इसे किसी अन्य विशेषता से बुला रहा हूं, या इसके बजाय क्या करना है, तो एक विशेषता के लिए पैरा को कैसे पास किया जाए।फैक्ट्री_girl

उदा

FactoryGirl.define do 
    factory :currency do 
    name Forgery::Currency.description 
    sequence(:short_name) { |sn| "#{Forgery::Currency.code}#{sn}" } 
    symbol '$' 
    end 

    factory :price do 
    full_price { 6000 } 
    discount_price { 3000 } 
    currency 
    subscription 
    end 

    sequence(:base_name) { |sn| "subscription_#{sn}" } 

    factory :product do 
    name { generate(:base_name) } 
    type { "reading" } 
    duration { 14 } 


    trait :reading do 
     type { "reading subscription" } 
    end 

    trait :maths do 
     type { "maths subscription" } 
    end 

    trait :six_month do 
     name { "six_month_" + generate(:base_name) } 
     duration { 183 } 
    end 

    trait :twelve_month do 
     name { "twelve_month_" + generate(:base_name) } 
     duration { 365 } 
    end 

    factory :six_month_reading, traits: [:six_month, :reading] 
    factory :twelve_month_reading, traits: [:twelve_month, :reading] 

    trait :with_price do 
     transient do 
     full_price 6000 
     discount_price 3000 
     short_name 'AUD' 
     end 

     after(:create) do |product, evaluator| 
     currency = Currency.find_by(short_name: evaluator.short_name) || 
        create(:currency, short_name: evaluator.short_name) 
     create_list(
      :price, 
      1, 
      product: product, 
      currency: currency, 
      full_price: evaluator.full_price, 
      discount_price: evaluator.discount_price 
     ) 
     end 
    end 

    trait :with_aud_price do 
     with_price 
    end 

    trait :with_usd_price do 
     with_price short_name: 'USD' 
    end 
    end 
end 

create(:product, :with_aud_price) # works 
create(:product, :with_usd_price) # fails "NoMethodError: undefined method `with_price=' for #<Subscription:0x007f9b4f3abf50>" 

# What I really want to do 
factory :postage, parent: :product do 
    with_aud_price full_price: 795 
    with_usd_price full_price 700 
end 

उत्तर

6

:with_price विशेषता, अन्य विशेषताओं आप स्थापित कर रहे हैं से एक अलग लाइन पर होने की जरूरत है यानी बजाय इस की:

trait :with_usd_price do 
    with_price short_name: 'USD' 
end 

उपयोग करें:

trait :with_usd_price do 
    with_price 
    short_name: 'USD' 
end 
+0

मुझे वास्तव में समझ में नहीं आता कि यह क्यों काम करता है, लेकिन मुझे बहुत खुशी है कि यह करता है। – jim

+0

अनुमान में यह हूड कॉलिंग विशेषता ए के तहत प्रतीत होता है ए विशेषता के भीतर बी विशेषता गुण बी का एक उप-वर्ग बनाता है जो दर्शाता है कि यह एकाधिक विरासत का समर्थन करता है और कौन जानता है कि क्या होता है यदि आपके दोनों गुण समान क्षणिक गुण आदि को परिभाषित करते हैं। अनुमान लगाएं कि पहले या आखिरी व्यक्ति को केवल प्राथमिकता दी जाती है। कारखानों के लिए इस्तेमाल किए गए 'पैरेंट:: foo' वाक्यविन्यास जैसे कुछ के बजाय एक विधि कॉल की तरह विरासत को परिभाषित करने के लिए थोड़ा आश्चर्यजनक लगता है। – jim

+0

ठीक है। इसे आगे देखो, यह तब तक अच्छा है जब तक यह जाता है, लेकिन मैं अभी भी ओपी में कोड नमूने के बहुत नीचे उदाहरण नहीं कर सकता। अगर मैं इस फॉर्म में कोशिश करता हूं तो मुझे 'फैक्टरीगर्ल :: विशेषता वितरण परिभाषा मिलती है: विशेषता पहले ही परिभाषित है: full_price'। हम्म ... मैं इसे क्षणिक गुणों के लिए सरणी के साथ काम करने में सक्षम हो सकता हूं। – jim

0

मैं factory_bot 4.8.2 पर और निम्नलिखित मेरे लिए क्या काम करता है:

trait :with_usd_price do 
    with_price 
    short_name 'USD' 
end