2009-11-05 14 views
111

लोग,ActiveRecord, has_many: के माध्यम से, और बहुरूपी संघों

यकीन है कि मैं सही ढंग से इस बात को समझ बनाना चाहता हूं। और कृपया यहां विरासत के लिए मामले की उपेक्षा करें (SentientBeing), इसके बजाय has_many में polymorphic मॉडल पर ध्यान केंद्रित करने की कोशिश कर रहा है: रिश्तों के माध्यम से। जैसा कि कहा गया है, तो निम्न ...

class Widget < ActiveRecord::Base 
    has_many :widget_groupings 

    has_many :people, :through => :widget_groupings, :source => :person, :conditions => "widget_groupings.grouper_type = 'Person'" 
    has_many :aliens, :through => :widget_groupings, :source => :alien, :conditions => "video_groupings.grouper_type = 'Alien'" 
end 

class Person < ActiveRecord::Base 
    has_many :widget_groupings, :as => grouper 
    has_many :widgets, :through => :widget_groupings 
end 

class Alien < ActiveRecord::Base 
    has_many :widget_groupings, :as => grouper 
    has_many :widgets, :through => :widget_groupings 
end 

class WidgetGrouping < ActiveRecord::Base 
    belongs_to :widget 
    belongs_to :grouper, :polymorphic => true 
end 

एक आदर्श दुनिया में विचार करते हैं, मैं चाहता हूँ करने के लिए, एक विजेट और एक व्यक्ति को देखते हुए की तरह कुछ कार्य करें:

widget.people << my_person 

हालांकि, जब मैं करता हूँ यह, मैंने देखा है कि 'grouper' का 'प्रकार' हमेशा widget_groupings में शून्य है। हालांकि, अगर मैं निम्नलिखित की तरह कुछ करने के लिए:

widget.widget_groupings << WidgetGrouping.new({:widget => self, :person => my_person}) 

तब सभी काम करता है के रूप में मैं सामान्य रूप से अपेक्षा की होगी। मुझे नहीं लगता कि मैंने कभी यह गैर पॉलिमॉर्फिक एसोसिएशन के साथ देखा है और सिर्फ यह जानना चाहता था कि यह इस उपयोग के मामले में विशिष्ट था या यदि मैं संभावित रूप से एक बग पर देख रहा हूं।

किसी भी मदद के लिए धन्यवाद!

उत्तर

156

रेलवे 3.1.1 के साथ known issue है जो इस कार्यक्षमता को तोड़ देता है। यदि आपको यह समस्या हो रही है तो पहले अपग्रेड करने का प्रयास करें, इसे 3.1.2

में ठीक किया गया है। आप बहुत करीब हैं। समस्या यह है कि आप: स्रोत विकल्प का दुरुपयोग कर रहे हैं। : स्रोत polymorphic संबंधित_ संबंधों को इंगित करना चाहिए। फिर आपको बस इतना करना है कि आप जिस रिश्ते को परिभाषित करने की कोशिश कर रहे हैं उसके लिए Source_type निर्दिष्ट करें।

विजेट मॉडल को यह ठीक करने से आपको वही करने की अनुमति मिलनी चाहिए जो आप खोज रहे हैं।

class Widget < ActiveRecord::Base 
    has_many :widget_groupings 

    has_many :people, :through => :widget_groupings, :source => :grouper, :source_type => 'Person' 
    has_many :aliens, :through => :widget_groupings, :source => :grouper, :source_type => 'Alien' 
end 
+0

हे भगवान, जो इतनी दर्दनाक रूप से स्पष्ट है, मैं विश्वास नहीं कर सकता कि मैं इस पर सही चमकता हूं। धन्यवाद EmFi! – Cory

+0

कोई समस्या नहीं, मुझे लगता है कि मैंने इसे पहली बार ऐसा करने के तरीके के बारे में एक दिन के लिए परेशान किया था। इससे मदद नहीं मिली कि यह उन पहली चीजों में से एक था जिन्हें मैंने रेल में करने की कोशिश की थी जिसमें ट्यूटोरियल/पुस्तक के बाद शामिल नहीं था। – EmFi

+0

धन्यवाद EmFi। – jdl

-3

में कई हैं: के माध्यम से और बहुलक एक साथ काम नहीं करते हैं। यदि आप उन्हें सीधे एक्सेस करने का प्रयास करते हैं, तो उसे एक त्रुटि फेंकनी चाहिए। यदि मुझे गलत नहीं है, तो आपको विजेट लिखना होगा। लोग और पुश दिनचर्या।

मुझे नहीं लगता कि यह एक बग है, यह केवल कुछ ऐसा है जो अभी तक लागू नहीं किया गया है। मुझे लगता है कि हम इसे इस सुविधा में देखते हैं, क्योंकि हर किसी के पास ऐसा मामला होता है जिसमें वे इसका उपयोग कर सकते हैं।

+5

वे एक साथ काम करते हैं में निश्चित होती है। उदाहरण के लिए: has_many: सब्सक्रिप्शन,: as =>: सब्सक्राइब करने योग्य has_many: ग्राहक,: through =>: सदस्यता, स्रोत =>: उपयोगकर्ता – ScottJ

+0

मैं अपने असफल कोड का एक उदाहरण निकट में एक अलग पोस्ट के रूप में फेंक दूंगा भविष्य :) यह मुझे उस त्रुटि को बाईपास करने के तरीके को समझने के लिए सिरदर्द का बहुत से बचाएगा। – cgr

3

जैसा कि ऊपर उल्लेख, इस रेल 3.1.1 पर बग के कारण के साथ काम नहीं करता है: स्रोत है, लेकिन यह रेल 3.1.2

+0

https://github.com/rails/rails/issues/3271 – EmFi

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