अपने प्रस्तावित समाधान के साथ गलत तार्किक कुछ भी नहीं है। हालांकि, आप शायद कुछ इस तरह करने की जरूरत है:
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।
यदि आपकी आवश्यकताओं के लिए एक साधारण अनुकूलता सूची काम करती है तो उसके साथ जाएं। यह समझने के लिए निश्चित रूप से सबसे सरल और आसान है। ऐसे रत्न हैं जो नेस्टेड सेट को लागू करते हैं, और शायद कुछ अन्य पेड़ों के पैटर्न के लिए भी, इसलिए यदि आप उस मार्ग पर जाते हैं तो आपको अपने आप को भारी उठाने की ज़रूरत नहीं है।
वाह! भयानक उत्तर, आपके जैसे लोग इस महान साइट की तरह साइट बनाते हैं। धन्यवाद! –
[यह उत्तर] (http://stackoverflow.com/a/11162888/638425) क्लोजर टेबल्स पैटर्न को कार्यान्वित करते समय आसान हो सकता है। – elhoyos
महान उत्तर, इसके लिए धन्यवाद! यह एक मॉडल के साथ पोस्ट पर टिप्पणियों जैसी चीजों को करने में मददगार है। – Tomanow