2012-04-20 14 views
8

इम एक मुद्दा एक रेल has_many स्थापित करने का एक सा होने: के माध्यम से: बहुरूपी रिश्ते।एक रेल has_many नामकरण: के माध्यम से: बहुरूपी रिश्ते

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

class Milestone < ActiveRecord::Base 
    has_many :responsible_items, :as => :responsibility 
    has_many :responsible, :through => :responsible_items 
end 

class ResponsibleItem < ActiveRecord::Base 
    belongs_to :responsible, :class_name => "User" 
    belongs_to :responsibility, :polymorphic => true 
end 

class User < ActiveRecord::Base 
    has_many :responsible_items, :foreign_key => :responsible_id 
    has_many :responsibilities, :through => :responsible_items 
end 

यह ठीक काम करने के लिए, त्रुटि के बिना, चीजों की मील का पत्थर की ओर से लगता है:

वैसे भी मैं निम्नलिखित सेटअप है। टर्मिनल में उदाहरण के लिए मैं लिख सकते हैं:

Milestone.first.responsible 

... और एक खाली संग्रह के रूप में मैं उम्मीद थी मिलता है।

हालांकि, चीजों के उपयोगकर्ता पक्ष, चलने से:

User.first.responsibilities 

... एक एआर त्रुटि लौट रहा है:

ActiveRecord::HasManyThroughAssociationPolymorphicSourceError: Cannot have a has_many :through association 'User#responsibilities' on the polymorphic object 'Responsibility#responsibility'. 

मैं इस मुद्दे संभालने हूँ तथ्य यह है कि के साथ कुछ है मैं उपयोगकर्ता संबंधों का जिक्र कर रहा हूं: जिम्मेदार। क्या यह सही है?

किसी भी मदद की बहुत सराहना की जाएगी, धन्यवाद।

+1

मॉडल है कि बहुरूपी रिश्ते के दूसरी तरफ हैं क्या हैं? क्या यह सिर्फ मील का पत्थर या कोई अन्य मॉडल भी है? और जब आप उपयोगकर्ता कर रहे हैं। सबसे पहले। उत्तरदायित्व क्या आप मील का पत्थर वस्तुओं की उम्मीद कर रहे हैं? संबंधित_to: जिम्मेदारी,: polymorphic => true – Abid

+0

पॉलिमॉर्फिक रिश्ते में अन्य मॉडल होंगे लेकिन मीलस्टोन एकमात्र ऐसा है जिसे मैंने अभी तक बनाया है। जब मैं 'user.first.responsibilities 'करता हूं तो मैं मीलस्टोन ऑब्जेक्ट्स हां की अपेक्षा कर रहा हूं। – Pete

+1

आह ठीक @Abid तुम मुझे अपने प्रश्न के साथ लगता है बनाया है। मैं स्वाभाविक रूप से 'जिम्मेदारियों' के संग्रह को खींचने में सक्षम नहीं हूं: पॉलिमॉर्फिक रिश्ते क्योंकि वे सभी अलग-अलग वस्तुओं से संबंधित हैं। नतीजतन मुझे उपयोगकर्ता मॉडल और राज्य पर अधिक विशिष्ट होना चाहिए कि मैं कौन सी ज़िम्मेदारियों को चाहता हूं यानी 'है_मनी: मीलस्टोन_स्पॉन्सिबिलिटीज:: through =>: जिम्मेदार_इटम्स,: स्रोत =>: ज़िम्मेदारी,: स्रोत_ प्रकार =>' मीलस्टोन ' – Pete

उत्तर

11

@ एबीड की टिप्पणी के लिए धन्यवाद, मुझे उपयोगकर्ता के लिए सभी responsibilities में खींचने की रसद के बारे में सोच रहा था, जो संभव नहीं था।

class User < ActiveRecord::Base 
    has_many :responsible_items, :foreign_key => :responsible_id 
    has_many :milestone_responsibilities, :through => :responsible_items, :source => :responsibility, :source_type => 'Milestone' 
end 

मैं तो इस विस्तार कर सकते हैं के रूप में मैं उदाहरण के लिए अन्य मॉडलों पर आगे बहुरूपी रिश्तों को जोड़ने:

class User < ActiveRecord::Base 
    has_many :responsible_items, :foreign_key => :responsible_id 
    has_many :milestone_responsibilities, :through => :responsible_items, :source => :responsibility, :source_type => 'Milestone' 
    has_many :task_responsibilities, :through => :responsible_items, :source => :responsibility, :source_type => 'Task' 
end 
मैं मैं क्या रिश्ते से चाहता था और परिणाम के रूप में निम्नलिखित काम किया परिभाषित करने के बारे में अधिक विशिष्ट होने की जरूरत
+1

बिल्कुल सवाल पूछने की मेरी बात थी, इसलिए आप पता लगा सकते हैं कि आप क्या कर रहे हैं कुछ :) – Abid

+0

धन्यवाद याद आ रही है! इससे मेरी मदद की! :) – ZedTuX

+0

वाह, यह सिर्फ मैं क्या देख रहा था है! "source_type" ने मेरे लिए दिन बचाया। –

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