2013-04-29 8 views
9

के साथ एक मॉडल प्रविष्टि बनाना, मैं अपने डेटाबेस में एक कनेक्शन के लिए एक नया प्रविष्टि जोड़ने की कोशिश कर रहा हूं जिसमें संबंध है। मेरे पास 2 मॉडल, नौकरियां और ग्राहक हैं।रेल पर रूबी: एक belong_to एसोसिएशन

इन दोनों के बीच संबंध स्थापित करने के लिए ट्यूटोरियल ढूंढना इतना आसान था (has_many और belong_to का उपयोग करके), लेकिन मुझे ऐसा कोई उदाहरण नहीं दिख रहा है जहां एसोसिएशन वास्तव में उपयोग किया जाता है।

मेरे कोड में, मैं पहले ग्राहक के लिए एक नया काम बनाने की कोशिश कर रहा हूं। जॉब्स मॉडल में क्लाइंट_आईड के लिए एक विशेषता है, और मुझे पता है कि मैं शायद मैन्युअल रूप से विशेषता को भर सकता हूं, लेकिन आसानी से इसे पूरा करने के लिए कुछ रूबी सम्मेलन होना चाहिए।

Job.create(:client_id => 1, :subject => "Test", :description => "This is a test") 

मैं इसे आसानी से अपने कोड में डाल सकता हूं, लेकिन मुझे लगता है कि रूबी को ऐसा करने का बेहतर तरीका है। यहां मेरे मॉडल सेट किए जाने का तरीका है

class Job < ActiveRecord::Base 
    attr_accessible :actual_time, :assigned_at, :client_id, :completed_at, :estimated_time, :location, :responded_at, :runner_id, :status, :subject, :description 
    belongs_to :client 
end 

class Client < User 
    has_many :jobs 
end 

class User < ActiveRecord::Base 
    attr_accessible :name, :cell, :email, :pref 

end 
+0

'ग्राहक = Client.new; जॉब.क्रेट (: क्लाइंट => क्लाइंट,: विषय => "टेस्ट",: विवरण => "यह एक परीक्षण है") ' – tessi

उत्तर

12

बस ग्राहक की jobs संग्रह पर create फोन ऑब्जेक्ट सहेजने के लिए मान्य नहीं है (यदि आप अनिवार्य नाम आदि जैसे सत्यापन सेट करते हैं)।

+1

खराब, आईडी = 1 के साथ कोई प्रविष्टि नहीं होने पर ActiveRecord :: RecordNotFound को बढ़ाएगा .... 'क्लाइंट.फिंड (: पहला)' या 'क्लाइंट.फर्स्ट' – MrYoshiji

+3

@MrYoshiji का उपयोग अपवाद बढ़ाने का आमतौर पर अपेक्षित व्यवहार होता है चूंकि रैलियों में 'रिकॉर्ड नॉटफाउंड' अपवादों को अपवाद ऐप में 404 अनुरोधों में अनुवादित किया गया है। – alf

+0

धन्यवाद मुझे लगता है कि यह समाधान सबसे अच्छा लगता है। – user2158382

-3

नए उदाहरण बनाने के लिए आप कारखानों का उपयोग कर सकते हैं। इसके लिए आपको बस FactoryGirl https://github.com/thoughtbot/factory_girl

इस्तेमाल कर सकते हैं तो बाद आप इस तरह अपने कारखाने soewhat परिभाषित किया है:

FactoryGirl.define कर कारखाना: काम करने के ग्राहक FactoryGirl.create (: ग्राहक) विषय 'टेस्ट' विवरण 'यह एक टेस्ट है'

फिर आप फैक्टरीगर्ल.क्रेट (नौकरी) को उस तरह की नई नौकरी उत्पन्न करने के लिए कॉल कर सकते हैं। (: काम, ग्राहक: aClientYouInstantiatedBefore, विषय: 'AnotherTest') तुम भी FactoryGirl.build कह सकते हैं और किसी भी अन्य विशेषताओं

के ऊपर लिख

आप कई वस्तुओं, कि एक निश्चित तरीके से मिलते-जुलते हैं बनाना चाहते हैं Factores अच्छे हैं ।

client = Client.create 
job = Job.create(client_id: client.id, subject: 'Test', description: 'blabla') 

create विधि अगर एक त्रुटि बढ़ा देंगे: काम बनाने के लिए

c = Client.find(1) 
c.jobs.create(:subject => "Test", :description => "This is a test") 
+1

कहीं भी उनके प्रश्न में, उन्होंने उल्लेख किया कि वह चश्मा के लिए ऐसा करना चाहता है। – kiddorails

+0

यदि आप विकास के लिए कारखाने की लड़की का उपयोग कर रहे हैं तो आप इसे गलत कर रहे हैं, तो आप न केवल चश्मा या परीक्षण – MentholBonbon

+6

में कारखानों का उपयोग कर सकते हैं। – Senjai

1

आप तर्क के रूप में वस्तु पारित कर सकते हैं:

+0

यह केवल तभी काम करता है जब 'क्लाइंट' को' attribute_accessible' – alf

+0

के रूप में चिह्नित किया गया है, टिप्पणी @alfonso – MrYoshiji

+0

टिप्पणी के लिए धन्यवाद, लेकिन यह भी अन्य वाक्यविन्यास बेहतर है। – user2158382

1

ऑब्जेक्ट को अपनी आईडी पास करने के बजाय ऑब्जेक्ट को एक तर्क के रूप में पास करें। यही है, :client_id => 1 या :client_id => client.id पास करने के बजाय, :client => client पास करें।

client = Client.find(1) 
Job.create(:client => client, :subject => "Test", :description => "This is a test") 
0

आप इस तरह से create_job उपयोग कर सकते हैं:

association 
association=(associate) 
build_association(attributes = {}) 
create_association(attributes = {}) 
create_association!(attributes = {}) 

कुल मिलाकर:

client = Client.create 
job = client.create_job!(subject: 'Test', description: 'blabla') 

जब आप एक belongs_to संघ की घोषणा की घोषणा वर्ग स्वचालित रूप से संघ से संबंधित पांच तरीकों लाभ इन तरीकों में से, एसोसिएशन को belongs_to पर पहला तर्क के रूप में पारित प्रतीक के साथ प्रतिस्थापित किया गया है।

अधिक: http://guides.rubyonrails.org/association_basics.html#belongs-to-association-reference

संबंधित मुद्दे