2012-12-13 14 views
17

प्रमाणीकरण के साथ कई संबद्ध हैं। मेरे पास एक मानक has_many संबंध है (बुकिंग में कई ऑर्डर हैं) सत्यापन के साथ कि बुकिंग कम से कम एक आदेश के बिना सहेजा नहीं जाता है। मैं इसे अपने फैक्टरीगर्ल कारखानों के साथ दोहराने की कोशिश कर रहा हूं लेकिन सत्यापन मुझे ऐसा करने से रोक रहा है।फैक्टरीगर्ल के पास

class Booking < ActiveRecord::Base 
    has_many :orders 
    validates :orders, presence: true 
end 

class Order < ActiveRecord::Base 
    belongs_to :booking 
end 

फैक्टरीगर्ल के गिटहब विकी पेज के बाद प्रत्येक मॉडल के लिए मेरे फैक्टॉयगर्ल फैक्ट्री विनिर्देश यहां दिए गए हैं।

FactoryGirl.define do              

    factory :booking do                             
    factory :booking_with_orders do 

     ignore do                               
     orders_count 1                             
     end                                

     before(:create) do |booking, evaluator|                       
     FactoryGirl.create_list(:order, evaluator.orders_count, booking: booking)              
     end                                
    end                                 
    end 

    factory :order do 
    booking 
    end 

end 

जब मैं अपने कल्पना से FactoryGirl.create(:booking_with_orders) चलाने का प्रयास, मैं मिलता है:

Failure/Error: @booking = FactoryGirl.create(:booking_with_orders) 
ActiveRecord::RecordInvalid: 
    Validation failed: Orders can't be blank 

यह मान्यता भी before(:create) [...] जो सैद्धांतिक रूप से बुकिंग के लिए आदेश बनाने से पहले चल रहा है के लिए चेक की तरह लगता है।

This post आपके कारखानों के साथ has_many संबंध जोड़ने की सिफारिश नहीं करता है, लेकिन अगर ऐसा करने का कोई अच्छा तरीका है तो मैं इसे हल करना चाहता हूं।

अग्रिम धन्यवाद। (जिसका अर्थ है कि Booking जरूरतों

उत्तर

30

वाट? असंभव? हर्गिज नहीं।

बस कुछ इस तरह करने के लिए अपने कोड बदलने के लिए: अगर आप सिर्फ एक विशिष्ट विशेषता के साथ एक एकल() की आवश्यकता जुड़े रिकॉर्ड जोड़ने की जरूरत है

after :build do |booking, evaluator| 
    booking.orders << FactoryGirl.build_list(:order, evaluator.orders_count, booking: nil) 
end 
+0

आपका मतलब है 'बुकिंग.ऑर्डर <<' लेकिन अन्यथा, यह मेरे लिए जवाब था। धन्यवाद! – Jalada

+0

ओह! इसे ठीक किया गया, इसे – jassa

+0

उत्कृष्ट इंगित करने के लिए धन्यवाद! आपका बहुत बहुत धन्यवाद! – gayavat

0

यह एक बेहद साधारण अवलोकन की तरह लगता है, लेकिन है कि आप क्या करने की कोशिश कर रहे हैं प्रभाव में है Booking, जो असंभव है से पहले यह सुनिश्चित करें कि Order मौजूद है, के रूप में Order अपने booking_id बिना नहीं हो सकता पहले बनाया जाना है)।

आपके कारखानों में has_many रिश्ते के साथ कुछ भी गलत नहीं है, यह आपकी मान्यता है कि एक समस्या है। क्या यह वर्तमान में आपके आवेदन में काम करता है? आप उस मामले में अपने रिकॉर्ड कैसे सहेजते हैं? ऑर्डर और बुकिंग बनाने के लिए प्रवाह क्या है?

यहां तक ​​कि कुख्यात accepts_nested_attributes_for यहां आपकी सहायता नहीं करेगा।

मेरी सलाह है कि आप अपनी रिकॉर्ड बचत और सत्यापन रणनीति पर पुनर्विचार करें ताकि यह थोड़ा और अधिक हो।

+0

धन्यवाद, यह एक अच्छा विचार है लेकिन सब कुछ मेरे आवेदन में सत्यापन के साथ काम कर रहा है। यहां मेरा प्रवाह है: '@booking = Booking.new (पैराम्स [: बुकिंग]) ''@booking.orders << आदेश। नया (पैराम्स [: आदेश])' '@ बुकिंग.save'। –

+0

@ErikNomitch क्या आपने 'पहले (: बनाएं)' के बजाय '(: build) 'कॉलबैक की कोशिश की है? 'बुकिंग' सेट अप पर आपका सत्यापन कैसा है? मुझे लगता है कि इस मुद्दे का असली क्रूक्स यह है कि फैक्ट्रीगर्ल शायद इन ऑब्जेक्ट्स को अलगाव में बनाना चाहता है, जो एक परीक्षण बिंदु से समझ में आता है, लेकिन जब आप उन्हें बनाते हैं तो आपने अपनी टिप्पणी में अभी ध्यान दिया है, वे एक साथ बनाए गए हैं। इस तरह के युग्मन आमतौर पर सिरदर्द की ओर जाता है। – regulatethis

2

@ Jassa के जवाब से लेते हुए, इस पद्धति मेरे लिए काम किया :

factory :booking do 
    ignore do 
    order_name "name" 
    end 

    after :build do |factory, evaluator| 
    factory.orders << FactoryGirl.build(:order, name: evaluator.order_name, booking: nil) 
    end 
end 
संबंधित मुद्दे