2010-08-15 16 views
5

मेरे पास एक मूल वस्तु है, पोस्ट, जिसमें निम्नलिखित बच्चे हैं।रिवर्स पॉलिमॉर्फिक एसोसिएशन

has_one :link 
has_one :picture 
has_one :code 

ये बच्चे पारस्परिक रूप से अनन्य हैं।

क्या रिमूवर में पॉलिमॉर्फिक एसोसिएशन का उपयोग करने का कोई तरीका है ताकि मेरे पास अपनी पोस्ट टेबल में link_id, picture_id और code_id फ़ील्ड न हों?

+0

क्या यह समझ में आता है कि तस्वीर के पास है: has_many रिश्ता? फिर आप जो भी खोज रहे हैं वह कर सकते हैं .. – Trip

उत्तर

8

मैं एक छोटे से ऐसा करने के तरीके दिखा सार ऊपर लिखा है: https://gist.github.com/1242485

+0

धन्यवाद, यह वही है जो मैं ढूंढ रहा था। –

0

मुझे विश्वास है कि आप विकल्प has_one के लिए देख रहे हैं। यह आपको belongs_to एसोसिएशन एंड का नाम निर्दिष्ट करने की अनुमति देता है।

सब और जब विफल रहता है, डॉक्स पढ़ें: http://apidock.com/rails/ActiveRecord/Associations/ClassMethods/has_one

+0

शायद मुझे कुछ याद आ रहा है, लेकिन मैं बच्चे के साथ एक गतिशील सहयोग कैसे बनाऊंगा: जैसा? मैं पॉलिमॉर्फिज्म को समझता हूं कि कैसे बच्चे के ऑब्जेक्ट में किसी प्रकार का मूल ऑब्जेक्ट हो सकता है। लेकिन मैं जो पूछ रहा हूं वह यह है कि कैसे एक मूल वस्तु के किसी भी प्रकार की बाल वस्तु हो सकती है। मैं @ post.postable जैसे कुछ करना चाहता हूं और बच्चे की वस्तु प्राप्त करना चाहता हूं, जो लिंक, चित्र या कोड में से एक होगा। –

0

वहाँ रिवर्स में बहुरूपी संघों का उपयोग करने के लिए इतना है कि मैं में link_id, picture_id, और code_id क्षेत्रों के लिए की जरूरत नहीं है एक रास्ता है मेरा पोस्ट टेबल?

has_one का तात्पर्य है कि विदेशी कुंजी अन्य तालिका में है। यदि आपने वास्तव में इस तरह अपना मॉडल परिभाषित किया है, तो आपके पास link_id, picture_id, और code_id आपकी पोस्ट तालिका में नहीं होगा। मुझे लगता है कि आप belongs_to कहना चाहते थे।

मैं @ post.postable की तरह कुछ करते हैं और बच्चे वस्तु है, जो लिंक में से एक, चित्र, या कोड होगा करना चाहते हैं।

मैं तुम्हें एसटीआई का उपयोग करने और links, pictures, और codes तालिकाओं के संयोजन, तो मॉडल के प्रकार के परीक्षण जब पुन: प्राप्त करने से ऐसा कर सकता है विश्वास करते हैं। हालांकि यह कट्टरपंथी लगता है, और कई अप्रयुक्त कॉलम के साथ समाप्त हो सकता है।

क्या अंतरिक्ष सहेजने के अलावा, अप्रयुक्त आईडी कॉलम को संग्रहीत करने का कोई कारण नहीं है? आप उन्हें रखने के लिए तैयार हैं, तो आप एक आभासी विशेषता है और एक postable_type स्तंभ निर्धारित कर सकते हैं: (अपरीक्षित कोड, शानदार विफल हो सकता है)

def postable 
    self.send(self.postable_type) 
end 

def postable=(p) 
    self.send(postable_type.to_s+"=",p) 
end 
+0

मैं कई * _id कॉलम होने की तुलना में चीजों को करने का एक और अधिक शानदार तरीका खोज रहा हूं। यद्यपि यह धागा साबित हो रहा है, कई * _id कॉलम दृष्टिकोण शायद सबसे सरल और सबसे अच्छा है। –

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