2009-05-14 9 views
57

मैं RoR में has_one संबंधों को समझने की कोशिश कर रहा हूं।रेल में has_one और belong_to के बीच अंतर?

चलो कहते हैं कि मैं दो मॉडल हैं - Person और Cell:

class Person < ActiveRecord::Base 
    has_one :cell 
end 

class Cell < ActiveRecord::Base 
    belongs_to :person 
end 

मैं सिर्फ Cell मॉडल में has_one :person बजाय belongs_to :person का उपयोग कर सकते हैं?

क्या यह वही नहीं है?

+1

एक अच्छा [यहां ब्लॉग] (http://requiremind.com/differences-between-has-one-and-belongs-to-in-ruby-on-rails/) इसके लिए! –

+0

उपरोक्त कोड गलत है, 'has_one: cell' और 'belong_to: person' होना चाहिए ** ** ** ** कोलन और निम्न शब्द के बीच एक स्थान नहीं होना चाहिए। – Josh

उत्तर

142

नहीं, वे अंतर-परिवर्तनीय नहीं हैं, और कुछ वास्तविक अंतर हैं।

belongs_to का अर्थ है कि इस वर्ग के लिए विदेशी कुंजी तालिका में है। तो belongs_to केवल उस कक्षा में जा सकता है जिसमें विदेशी कुंजी है।

has_one का अर्थ है कि इस वर्ग का संदर्भ देने वाली दूसरी तालिका में एक विदेशी कुंजी है। तो has_one केवल एक कक्षा में जा सकता है जिसे किसी अन्य तालिका में कॉलम द्वारा संदर्भित किया जाता है।

तो यह गलत है:

class Person < ActiveRecord::Base 
    has_one :cell # the cell table has a person_id 
end 

class Cell < ActiveRecord::Base 
    has_one :person # the person table has a cell_id 
end 

तो यह है:

class Person < ActiveRecord::Base 
    belongs_to :cell # the person table has a cell_id 
end 

class Cell < ActiveRecord::Base 
    belongs_to :person # the cell table has a person_id 
end 

एक दो तरह से संघ के लिए, आप प्रत्येक में से एक की जरूरत है, और वे सही कक्षा में जाना है। एक तरफा सहयोग के लिए भी, यह महत्वपूर्ण है कि आप किस का उपयोग करते हैं।

+0

अच्छा जवाब। अपना जवाब देखकर मुझे एहसास हुआ कि मैंने आधा प्रश्न पढ़ा है। मुझे खेद है, लेकिन खुशी है कि आप कूद गए। + 10 –

+5

मुझे इसे एक बिलियन बार देखना पड़ा। मेरी इच्छा है कि उन्होंने थोड़ा बेहतर नामकरण के माध्यम से सोचा था, ताकि यह स्पष्ट हो सके कि कोई कहां जाता है। –

+18

ग्रेट, अब मैं दो गलत उत्तरों को जानता हूं। इसे दिखाने के लिए "सही" तरीका दिखाने के लिए बेहतर होगा। मैं तो बस कह रहा हूं'। – y0mbo

7

दोनों का उपयोग करके आप व्यक्ति और सेल मॉडल दोनों से जानकारी प्राप्त कर सकते हैं।

@cell.person.whatever_info and @person.cell.whatever_info. 
10

यदि आप "belong_to" जोड़ते हैं तो आपको एक बिडरेक्शनल एसोसिएशन मिला है। इसका मतलब है कि आप सेल से व्यक्ति और व्यक्ति से एक सेल प्राप्त कर सकते हैं।

कोई वास्तविक अंतर नहीं है, दोनों दृष्टिकोण (बिना "belong_to" के साथ और बिना) डेटाबेस डेटाबेस स्कीमा (कक्ष डेटाबेस तालिका में एक person_id फ़ील्ड) का उपयोग करें।

सारांशित करने के लिए: "belong_to" को तब तक न जोड़ें जब तक आपको मॉडलों के बीच बिडरेक्शनल एसोसिएशन की आवश्यकता न हो।

+0

आज मैंने जो सबसे अच्छी लाइन पढ़ी है: "यदि आप" belong_to "जोड़ते हैं तो आपको एक द्विपक्षीय सहयोग मिला है। इसका मतलब है कि आप सेल से व्यक्ति और व्यक्ति से सेल प्राप्त कर सकते हैं।" +1 –

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