25

मैं रेल के लिए काफी नया हूं, और मैं एक पॉलिमॉर्फिक एचएबीटीएम संबंध करने की कोशिश कर रहा हूं। समस्या यह है कि मेरे पास तीन मॉडल हैं जिन्हें मैं जोड़ना चाहता हूं।एचएबीटीएम पॉलीमोर्फिक रिलेशनशिप

पहला वाला इवेंट मॉडल है और फिर दो प्रकार के उपस्थिति हैं: उपयोगकर्ता और संपर्क।

मैं क्या करना चाहता हूं वह एक उपस्थिति के रूप में उपयोगकर्ताओं और संपर्कों दोनों से संबंधित हो सकता है। तो, क्या मैं अपने कोड में है:

घटना मॉडल

has_and_belongs_to_many :attendees, :polymorphic => true 

उपयोगकर्ता मॉडल

has_and_belongs_to_many :events, :as => :attendees 

संपर्क मॉडल

has_and_belongs_to_may :events, :as => :attendees 
  1. एचएबीटीएम टेबल माइग्रेशन कैसे होना चाहिए? मैं थोड़ा उलझन में हूं और मुझे उस पर कोई मदद नहीं मिली है।
  2. क्या यह काम करने जा रहा है?

उत्तर

61

नहीं, आप ऐसा नहीं कर सकते हैं, polymorphic has_and_belongs_to_many एसोसिएशन जैसी कोई चीज़ नहीं है।

आप क्या कर सकते हैं एक मध्यम मॉडल बनाते हैं।

class Subscription < ActiveRecord::Base 
    belongs_to :attendee, :polymorphic => true 
    belongs_to :event 
end 

class Event < ActiveRecord::Base 
    has_many :subscriptions 
end 

class User < ActiveRecord::Base 
    has_many :subscriptions, :as => :attendee 
    has_many :events, :through => :subscriptions 
end 

class Contact < ActiveRecord::Base 
    has_many :subscriptions, :as => :attendee 
    has_many :events, :through => :subscriptions 
end 

इस तरह सदस्यता मॉडल एक एन में लिंक तालिका तरह बर्ताव करता है: यह शायद कुछ इस तरह होगा एन संबंध लेकिन आप घटना को बहुरूपी व्यवहार की अनुमति देता है।

0

Resolveu parcialmente।

यह हमारे निपटारे में ढांचे के कारण समस्या को हल करता है, लेकिन यह "अनावश्यक" जटिलता और कोड जोड़ता है। एक मध्यस्थ मॉडल (जिसे मैं बी कहूंगा) बनाकर, और ए -> बी -> सी "ए है_एमनी बी है जिसमें है_एमनी सी" है, हमारे पास एक और एआर मॉडल है जो एक बार एआर क्लास कार्यान्वयन को स्मृति में लोड करने के बाद लोड करेगा लोड किया गया, और सी उदाहरणों तक पहुंचने के एकमात्र उद्देश्य के लिए तत्काल होगा। आप हमेशा कह सकते हैं, यदि आप एसोसिएशन के माध्यम से उपयोग करते हैं, तो आप बी एसोसिएशन लोड नहीं करते हैं, लेकिन फिर आपको एक और अधिक अप्रचलित मॉडल के साथ छोड़ा जाएगा, जो केवल कारवां पास को देखने के लिए होगा।

असल में, यह एक ऐसी सुविधा हो सकती है जो सक्रिय रिकॉर्ड से गुम हो। मैं इसे जोड़ने के लिए एक प्रस्ताव के रूप में प्रस्तावित करता हूं, क्योंकि यह मेरे लिए चिंता का कारण रहा है (इस तरह मैं इस पोस्ट में समाधान ढूंढने की उम्मीद कर रहा हूं :))।

Cumprimentos

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