मैं इस प्रश्न का उत्तर स्वयं-संदर्भ संघ के दृष्टिकोण से देना चाहता हूं, न कि has_many: परिप्रेक्ष्य के माध्यम से।
मान लीजिए कि हमारे पास संपर्कों के साथ एक सीआरएम है। संपर्कों के अन्य संपर्कों के साथ संबंध होंगे, लेकिन हम दो अलग-अलग मॉडलों के बीच संबंध बनाने के बजाय, हम एक ही मॉडल के दो उदाहरणों के बीच संबंध बना रहे होंगे। एक संपर्क में कई दोस्त हो सकते हैं और कई अन्य संपर्कों से दोस्ती की जा सकती है, इसलिए हमें कई-कई रिश्ते बनाने होंगे।
यदि हम RDBMS और ActiveRecord का उपयोग कर रहे हैं, तो हम has_many का उपयोग करेंगे: के माध्यम से। इस प्रकार हमे फ्रेंडशिप की तरह एक जॉइन मॉडल बनाना होगा। इस मॉडल में दो फ़ील्ड होंगे, एक contact_id जो वर्तमान संपर्क का प्रतिनिधित्व करता है जो एक मित्र और एक मित्र को जोड़ रहा है_ जो उस उपयोगकर्ता का प्रतिनिधित्व करता है जो मित्रवत हो रहा है।
लेकिन हम MongoDB और Mongoid का उपयोग कर रहे हैं। जैसा कि ऊपर कहा गया है, Mongoid has_many नहीं है: के माध्यम से या एक बराबर सुविधा। यह MongoDB के साथ इतना उपयोगी नहीं होगा क्योंकि यह प्रश्नों में शामिल होने का समर्थन नहीं करता है। इसलिए, MongoDB जैसे गैर-RDBMS डेटाबेस में कई-कई संबंधों को मॉडल करने के लिए, आप दोनों तरफ 'विदेशी' कुंजियों के एक सरणी वाले फ़ील्ड का उपयोग करते हैं।
class Contact
include Mongoid::Document
has_and_belongs_to_many :practices
end
class Practice
include Mongoid::Document
has_and_belongs_to_many :contacts
end
जैसा कि प्रलेखन में कहा गया है:
कई रिश्तों में जहां उलटे दस्तावेज़ों को आधार दस्तावेज़ से एक अलग संग्रह में संग्रहीत किया जाता है, उन्हें Mongoid's has_and_belongs_to_many मैक्रो का उपयोग करके परिभाषित किया गया है। यह सक्रिय रिकॉर्ड के समान व्यवहार को इस अपवाद के साथ प्रदर्शित करता है कि किसी भी सम्मिलित संग्रह की आवश्यकता नहीं है, विदेशी कुंजी आईडी को संबंध के दोनों ओर सरणियों के रूप में संग्रहीत किया जाता है।
इस प्रकृति के संबंध को परिभाषित करते समय, प्रत्येक दस्तावेज़ को अपने संबंधित संग्रह में संग्रहीत किया जाता है, और प्रत्येक दस्तावेज़ में एक सरणी के रूप में दूसरे के लिए "विदेशी कुंजी" संदर्भ होता है।
# the contact document
{
"_id" : ObjectId("4d3ed089fb60ab534684b7e9"),
"practice_ids" : [ ObjectId("4d3ed089fb60ab534684b7f2") ]
}
# the practice document
{
"_id" : ObjectId("4d3ed089fb60ab534684b7e9"),
"contact_ids" : [ ObjectId("4d3ed089fb60ab534684b7f2") ]
}
अब MongoDB में एक स्व-संदर्भित एसोसिएशन के लिए, आपके पास कुछ विकल्प हैं।
has_many :related_contacts, :class_name => 'Contact', :inverse_of => :parent_contact
belongs_to :parent_contact, :class_name => 'Contact', :inverse_of => :related_contacts
संबंधित संपर्क और संपर्क कई होने और कई प्रथाओं से संबंधित होने के बीच क्या अंतर है? बड़ा अंतर! एक दो संस्थाओं के बीच एक संबंध है। अन्य एक आत्म-संदर्भ है।