12

के लिए लिखित एसोसिएशन यदि आप चाहें तो थोड़ी मदद के लिए।एक रिकर्सिव रिलेशनशिप

मैं अपने 'उत्पाद' वर्ग के साथ एक पुनरावर्ती संबंध बनाना चाहता हूं। जहां मैं एक उत्पाद अन्य उत्पादों के लिए मूल उत्पाद हो सकता हूं। मेरे प्रश्न यह है कि मैं अपने मॉडल के भीतर यह रिश्ता कैसे बना सकता हूं?

क्या यह उचित होगा?

has_many :products 
belongs_to :product 

उत्तर

38

अपने प्रस्तावित समाधान के साथ गलत तार्किक कुछ भी नहीं है। हालांकि, आप शायद कुछ इस तरह करने की जरूरत है:

belongs_to :parent, class_name: "Product", foreign_key: "parent_id" 
has_many :children, class_name: "Product", foreign_key: "parent_id" 

आप मूल रूप से एक "पेड़" शीर्ष और बच्चे उत्पादों की शाखाओं में नीचे गहरी भंडारण कर रहे हैं, एक उत्पाद के साथ, संभावित कई स्तरों।

आपके उदाहरण की रणनीति Adjacency List के रूप में जानी जाती है। किसी दिए गए रिकॉर्ड के प्रत्यक्ष माता-पिता और प्रत्यक्ष वंशजों को ढूंढना आसान है। हालांकि, सभी वंशजों (वंशजों के वंशज सहित) प्राप्त करना मुश्किल हो सकता है, और पेड़ जितना गहरा हो जाता है उतना मुश्किल हो जाता है।

एक विकल्प अक्सर उपयोग किया जाता है Nested Set, जहां प्रत्येक रिकॉर्ड ऑब्जेक्ट के बारे में जानकारी "बाएं" और "दाएं" पर संग्रहीत करता है। यह आपको एक पेड़ बनाने की अनुमति देता है, इससे कोई फर्क नहीं पड़ता कि कितना बड़ा, बहुत तेज़ (या कम से कम कुशलता से, एक ही प्रश्न में)। हालांकि, यह अधिक जटिल है और रिकॉर्ड डालने का मतलब आम तौर पर आपके द्वारा डाले गए रिकॉर्ड के दाईं ओर सभी रिकॉर्ड को पुन: गणना और अद्यतन करना है।

एक तीसरा विकल्प (और तर्कसंगत रूप से मध्य-जमीन का एक प्रकार) Path Enumeration का उपयोग कर रहा है, जहां ऑब्जेक्ट पेड़ में अपना पूरा पथ संग्रहीत करते हैं। तो, इस तरह एक पेड़ को देखते हुए:

A 
/\ 
B C 
    | 
    D 

A एक खाली पथ (कोई माता पिता) के लिए होता है, B और C पथ A होगा, D पथ A/C होगा। अधिकतर सम्मिलन संचालन इस समाधान के साथ अपेक्षाकृत सस्ती हैं, और पूछताछ बहुत आसान है। हालांकि, पेड़ में चारों ओर इसके बजाय जटिल और चलती वस्तुओं को महंगा हो सकता है।

अन्य विकल्प भी हैं, जैसे Closure Tables

यदि आपकी आवश्यकताओं के लिए एक साधारण अनुकूलता सूची काम करती है तो उसके साथ जाएं। यह समझने के लिए निश्चित रूप से सबसे सरल और आसान है। ऐसे रत्न हैं जो नेस्टेड सेट को लागू करते हैं, और शायद कुछ अन्य पेड़ों के पैटर्न के लिए भी, इसलिए यदि आप उस मार्ग पर जाते हैं तो आपको अपने आप को भारी उठाने की ज़रूरत नहीं है।

+0

वाह! भयानक उत्तर, आपके जैसे लोग इस महान साइट की तरह साइट बनाते हैं। धन्यवाद! –

+0

[यह उत्तर] (http://stackoverflow.com/a/11162888/638425) क्लोजर टेबल्स पैटर्न को कार्यान्वित करते समय आसान हो सकता है। – elhoyos

+0

महान उत्तर, इसके लिए धन्यवाद! यह एक मॉडल के साथ पोस्ट पर टिप्पणियों जैसी चीजों को करने में मददगार है। – Tomanow

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