ruby on rails 3 एचएबीटीएम पॉलिमॉर्फिक रिलेशनशिप




ruby-on-rails-3 activerecord (2)

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

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

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

इवेंट मॉडल

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. क्या यह काम करने जा रहा है?

नहीं, आप ऐसा नहीं कर सकते हैं, 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

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


Resolveu parcialmente।

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

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

Cumprimentos