2009-07-21 18 views
12

मेरे पास दो मॉडल, उपयोगकर्ता और समूह हैं। प्रत्येक समूह में कई उपयोगकर्ता हो सकते हैं और प्रत्येक उपयोगकर्ता कई समूहों में हो सकता है।रेल (ActiveRecord) कई टेबल पर कई

मैं वर्तमान में कुछ सरल की तरह है:

उपयोगकर्ता:

has_many :groups 

समूह:

has_many :users 

तो मैं एक groups_users तालिका जो सिर्फ group_id और user_id साथ पंक्तियों पैदा कर रही है है। मैं इसमें एक और कॉलम जोड़ना चाहता हूं, (जो मेरे पास है), प्रश्न यह है कि मैं इसे कस्टम एसक्यूएल कॉल के बिना मॉडल से कैसे एक्सेस करूं? समूह मॉडल में मैं self.users जा सकता हूं और उपयोगकर्ता में मैं self.groups

उपयोगकर्ता तालिका से इस तालिका में तीसरे कॉलम को बदलने का कोई तरीका है?

क्षमा अगर यह भ्रामक है, यह

उत्तर

12

यहाँ पर कृपया सलाह ट्यूटोरियल है कि मदद करनी चाहिए की एक जोड़ी है। असल में कई सारे काम करने के लिए दो दृष्टिकोण हैं, या तो has_and_belongs_to_many या has_many: के माध्यम से (अनुशंसित) है।

लिंक:

  1. http://blog.hasmanythrough.com/2006/4/20/many-to-many-dance-off
  2. http://railscasts.com/episodes/47-two-many-to-many
  3. http://railscasts.com/episodes/154-polymorphic-association
+0

विशेष रूप से 2 लिंक। कार्रवाई में has_and_belongs_to_many का शानदार उदाहरण है। –

+0

क्या वे लिंक अभी भी प्रासंगिक हैं? – shem

2

मैं [जोड़ा] [users_groups] के लिए एक और स्तंभ ... सवाल यह है कि मैं पहुँच करते हैं यह एक कस्टम एसक्यूएल सी का उपयोग किए बिना मॉडल से है सब?

ऐसा लगता है कि आप अपने User मॉडल या अपने Group मॉडल पर एक विधि को फोन करके अपने user_groups तालिका के एक स्तंभ का उपयोग करना चाहते हैं।

कुछ सुझाव:

मैं टेबल "user_groups" ActiveRecord के pluralization उम्मीदों के साथ काम करने के लिए नाम चाहते हैं, लेकिन मुझे यकीन है कि अगर आवश्यक है नहीं कर रहा हूँ।

डेव की सलाह के बाद, आप "has_many :through" तकनीक का उपयोग कर बातें की स्थापना करना चाहते हैं ...

# Declare a Model based on the many-to-many linking table. 
class UserGroup < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :group 
end 

class User < ActiveRecord::Base 
    has_many :user_groups 
    has_many :groups, :through => :user_groups 
end 

class Group < ActiveRecord::Base 
    has_many :user_groups 
    has_many :users, :through => :user_groups 
end 

वहाँ एक उपयोगकर्ता मॉडल से इस तालिका में तीसरे स्तंभ को बदलने के लिए एक रास्ता है ?

यह एक छोटे से स्पष्ट नहीं है, लेकिन ध्यान रखें कि प्रत्येक UserUserGroups का एक बहुत हो सकता है में रहते हैं। तो यदि आप उस तीसरे कॉलम को बदलना चाहते हैं तो आपको वह विशेष खोजना होगा जिसे आप ढूंढ रहे हैं।

+0

यदि आपको उपयोगकर्ता समूह तालिका में किसी भी अतिरिक्त डेटा की आवश्यकता नहीं है, तो अपने ActiveRecord को पूरी तरह से छोड़ दें, और उपयोगकर्ता और समूह के बीच 'has_and_belongs_to_many' एसोसिएशन का उपयोग तालिका में शामिल करें। दूसरे उत्तर पर दूसरा लिंक देखें। Django में –

+0

, कई सहायक तालिका में कई लोगों के लिए तीसरा कॉलम जोड़ना आसान है: आप केवल उस मॉडल को फ़ील्ड जोड़ें जिसे आप "through" से भी एक्सेस करते हैं। आपके उदाहरण में एक और कॉलम उपयोगी है यदि आप ई। जी। उपयोगकर्ता को समूह में एक निश्चित स्थिति (सक्रिय या नहीं) देना चाहते हैं। – Timo

7

रेल 3 में आप वर्णमाला क्रम में शामिल होने वाले टेबल के बहुवचन नामों का उपयोग करके कई रिश्ते में कई लोगों के लिए एक जॉइन टेबल बनाना चाहते हैं। तो इस मामले में यह groups_users होगा।

मॉडल

class GroupsUser < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :group 
end 

class User < ActiveRecord::Base 
    has_many :groups_users 
    has_many :groups, :through => :groups_users 
end 

class Group < ActiveRecord::Base 
    has_many :groups_users 
    has_many :users, :through => :groups_users 
end 
+1

जानना दिलचस्प होगा कि किसी संबंधित क्षेत्र को कैसे देखें – Timo

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