2011-10-20 6 views
33

मैं जानता हूँ कि "belongs_to: के माध्यम से" मान्य नहीं है, इसकी सिर्फ अपनी प्रयास व्यक्त करने के लिए मैं क्या हासिल करना चाहते, बस एक सेकंड के लिए मेरे साथ सहन ...प्रत्यक्ष belong_to सेट किए बिना "belong_to: through" प्रकार का सेटअप कैसे करें?

यह मैं क्या मिल गया है:

class League 
    has_many :divisions 
end 

class Division 
    belongs_to :league 
    has_many :teams 
end 

class Team 
    belongs_to :division 
    has_many :players 
end 

class Player 
    belongs_to :team 
end 

अब, आदेश में एक "बेसबॉल कार्ड" दृश्य प्रपत्र बनाने के लिए, मैं की जरूरत है:

name 
team.name 
team.division.name 
team.division.league.name 

तो, वहाँ एक "belongs_to: के माध्यम से" सेटअप करने के लिए एक तरीका है सीधे से 'division.name' का उपयोग करने की 'टीम' के बिना 'players_ नियंत्रक'। उपसर्ग ?? मुझे 'प्लेयर' से 'डिवीजन' तक कई कॉलम एक्सेस करना है, इसलिए उन कॉलमों को "प्रत्यक्ष" पहुंच प्राप्त करने का एक तरीका ढूंढना है।

एक विकल्प 'खिलाड़ियों' तालिका में 'division_id' कॉलम शामिल करना है, लेकिन मुझे बताया गया है कि यह संबंधपरक डेटा मॉडल को तोड़ देगा, क्योंकि डेटा चयन कार्यक्षमता नहीं होने पर यह असंगतता की अनुमति देगी ठीक तरह से संभाला गया (उदाहरण के लिए प्लेयर ए टीम ए पर है जो विभाजन ए में है, लेकिन प्लेयर ए के पास डिवीजन_आईडी कॉलम विभाजन बी पर सेट है)।

क्या यह "प्रतीकात्मक लिंक" बनाना संभव है, उदा। 'डिवीजन' अब 'team.division' को संदर्भित करता है, और 'लीग' अब 'team.division.league' को संदर्भित करता है ??

या, हर बार पूर्ण पथ का उपयोग करने का एकमात्र सही विकल्प है ??

उम्मीद है कि कोई मदद कर सकता है।

बीआर, जोनास

+3

हाय जोनास, कृपया मैट स्मिथ के उत्तर का चयन के रूप में इस के रूप में सही एक और अधिक सुरुचिपूर्ण दृष्टिकोण है। – emrass

उत्तर

61

उपयोग प्रतिनिधि।

class Team < ActiveRecord::Base 
    belongs_to :division 
    has_many :players 

    delegate :league, to: :division 
end 

संदर्भ: http://api.rubyonrails.org/classes/Module.html#method-i-delegate

+1

यह सबसे अच्छा तरीका है, और Blackbird07 के बजाय चुना जाना चाहिए। – Jazz

+2

मैं सहमत हूं! <टिप्पणी लंबाई प्रतिबंध को संतुष्ट करने के लिए पाठ> – emrass

+5

यह सुरुचिपूर्ण है लेकिन आपको ऑब्जेक्ट पेड़ में प्रत्येक स्तर के लिए एक क्वेरी करने की आवश्यकता है। इसलिए यदि आपको केवल शीर्ष वस्तु की आवश्यकता है तो इसे एक SQL क्वेरी में पैक करना संभव है। इसके बाद के प्रश्न पूछे जाएंगे, लेकिन फिर भी केवल एक हस्तांतरण 'रेल - (क्वेरी) -> डेटाबेस - (परिणाम) -> रेल'। दुर्भाग्यवश मुझे रेल क्वेरी इंटरफ़ेस के साथ ऐसा करने के लिए गर्म नहीं पता है। कोई जानता है? – pablo

7

आप अपने खिलाड़ी मॉडल में एक सहायक विधि को परिभाषित कर सकते हैं:

def division 
    team.division 
end 

def league 
    team.division.league 
end 
बेशक

, यह केवल अपने कोड की पठनीयता से संबंधित है और डेटाबेस के रूप को प्रभावित नहीं करता प्रश्न शामिल हैं। अपने बयान कई एसक्यूएल प्रश्नों उत्पन्न करता है लेकिन आप केवल एक चाहते हैं, .include विकल्प यहाँ की जाँच: Rails Guides - Active Record Query Interface

+0

धन्यवाद, यह चाल चल रहा है: ओ) –

7

आप मॉडल कक्षा में की कोशिश कर सकते

 
    class Player 
     belongs_to :team 
     has_one :division, :through => :team 
    end 
+2

नहीं, आपको यह नहीं करना चाहिए। एक है_ऑन रिलेशनशिप एक विदेशी कुंजी के माध्यम से दूसरे मॉडल में एक rel_to संबंध का सुझाव देता है। लेकिन 'डिवीजन' 'belong_to: team' नहीं है, यह' has_many: टीमों 'है, जिसका अर्थ है टीम' belong_to: division'। मैट स्मिथ को यह सही मिला: आप प्लेयर तर्क में इस तर्क का भी उपयोग कर सकते हैं: 'प्रतिनिधि: विभाजन,: से =>: टीम'। –

+3

मैं आपके साथ सहमत हूं - रेल की वर्तमान स्थिति के लिए। लेकिन मैं सोच रहा हूं कि क्यों कोई संबंधित नहीं है: के माध्यम से। – Dogweather

+2

ओ.ओ! यह न्यूनतम संख्या में प्रश्नों के साथ काम करता है। मुझे लगता है कि 'belong_to: through' होना चाहिए! इसके अलावा आपका समाधान 'विभाजन' क्वेरी के परिणाम को कैश करता है। – pablo

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