2013-03-15 15 views
6

मुझे इसके आसपास अपने दिमाग को समझने/लपेटने में समस्या आ रही है। मैं एक रिश्ता है कि इस अनुमति देता है बनाने के लिए कोशिश कर रहा हूँ:कई से अधिक उपयोगकर्ता और समूह, लेकिन समूहों के मालिक

  • उपयोगकर्ता कई समूहों से संबंधित कर सकते हैं
  • समूह कई उपयोगकर्ताओं
  • एक समूह हो सकता है एक स्वामी ही उपयोगकर्ता
  • समूह स्वामित्व है जो है हस्तांतरणीय

मुझे कई से अधिक रिश्ते स्थापित किए गए हैं, लेकिन मुझे लगता है कि स्वामित्व कार्यक्षमता को कैसे स्थापित किया जाए, यह समझ में नहीं आता है।

यहाँ

क्या मैं अपने मॉडल में अब तक है:

class Group < ActiveRecord::Base 
     has_and_belongs_to_many :users 
     attr_accessible :name, :description, :isPublic, :tag_list, :owner 
    end 

    class User < ActiveRecord::Base 
     has_and_belongs_to_many :groups 
     attr_accessible :name, :description, :owner_id 
    end 

किसी भी मदद की बहुत सराहना की जाएगी !!

उत्तर

11

आप इसे कई तरीकों से सेट कर सकते हैं:)

1 एक मॉडल में शामिल होने का उपयोग करें और मॉडल है कि निर्दिष्ट करता है कि समूह के सदस्य स्वामी है में शामिल होने पर एक झंडा जगह।

class Group < ActiveRecord::Base 
    has_many :memberships 
    has_many :users, through: :memberships 
    attr_accessible :name, :description, :isPublic, :tag_list, :owner 
end 

class Membership < ActiveRecord::Base 
    belongs_to :group 
    belongs_to :user 

    #this table has a flag called owner and thus a method called owner? 
end 

class User < ActiveRecord::Base 
    has_many :memberships 
    has_many :groups, through: :memberships 
    attr_accessible :name, :description, :owner_id 
end 

2) अपने मौजूदा एचएबीटीएम को रखें और स्वामित्व को ट्रैक करने के लिए एक और शामिल मॉडल जोड़ें।

class Group < ActiveRecord::Base 
    has_and_belongs_to_many :users 
    has_many :group_ownerships 
    has_many :owners, through: :group_owernships, class_name: "User" 
    attr_accessible :name, :description, :isPublic, :tag_list, :owner 
end 

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

class User < ActiveRecord::Base 
    has_and_belongs_to_many :groups 
    has_many :group_ownerships 
    has_many :owned_groups, through: :group_owernships, class_name: "Group" 
    attr_accessible :name, :description, :owner_id 
end 
+1

प्रिय शॉन, मैं सिर्फ हम क्या कर सकते हैं की एक फायदा लिखा था (एक जवाब के रूप में) अगर हम एक मॉडल शामिल हों है, यानी एक लिंक तालिका। – beck03076

+1

इसका पहला भाग सबसे अच्छा जवाब है। यदि आप वास्तव में केवल एक समूह के लिए एक मालिक चाहते हैं, तो सदस्यता मॉडल पर एक सत्यापन दें। यह दृष्टिकोण आपको स्कीमा को बदले बिना एकाधिक मालिक (या व्यवस्थापक) भी देता है। –

+0

धन्यवाद। निजी तौर पर, मैं पहली विधि करता हूं, लेकिन मैं विकल्प देने के बारे में हूं। –

3

मुझे लगता है कि एक समाधान समूह से मालिक के नए belongs_to संबंध को परिभाषित करने के लिए किया जा सकता है। इसलिए आपको groups तालिका में एक नया user_id कॉलम जोड़ना होगा।

class Group < ActiveRecord::Base 
    has_and_belongs_to_many :users 
    belongs_to :owner, class_name: 'User', foreign_key: 'user_id' 
    attr_accessible :name, :description, :isPublic, :tag_list, :owner 
end 

class User < ActiveRecord::Base 
    has_and_belongs_to_many :groups 
    has_many :owned_groups, class_name: 'Group', foreign_key: 'user_id' 
    attr_accessible :name, :description, :owner_id 
end 

मुझे लगता है कि आपको यही चाहिए। उपयोगकर्ता के साथ, आपके पास सभी समूह हो सकते हैं, वह user.groups के साथ सदस्य हैं, और आपके पास user.owned_groups के सभी समूह हो सकते हैं। एक समूह के साथ, आप इसके मालिक हो सकते हैं: group.owner और उसके सभी सदस्य: group.users

आप मालिक बदलना चाहते हैं केवल आपके निश्चित रूप से अनुकूलित कर सकता है, group.owner = new_usernew_user के साथ शुरू एक User उदाहरण

ध्यान दें कि मैं जल्दी से संघ और विदेशी कुंजी के लिए नामित किया गया अपना चुना हुआ है।

0

लिंक तालिका दृष्टिकोण के बारे में क्या?

क्योंकि, यदि आपके पास उपयोगकर्ताओं और समूहों के लिए उपयोगकर्ता_ समूह के रूप में एक लिंक तालिका है, तो आप वास्तव में किसी उपयोगकर्ता के समूह और एक दूसरे के समूह के दौरान उस तालिका में एक और नई विशेषता संग्रहीत कर सकते हैं।

जब जॉन, उपयोगकर्ता समूह के समूह से संबंधित है, तो वह शरारती है। जब जॉन उपयोगकर्ता इंजीनियर के समूह से संबंधित होता है, तो वह स्मार्ट होता है। तो उपयोगकर्ता_ग्रुप तालिका में, मैं नीचे की तरह कुछ स्टोर कर सकता हूं।

उपयोगकर्ता

id | Name 
1 | John 
2 | Steve 

समूह

id | Name 
1| boys 
2| doctors 
3| beggars 

Users_Groups

user_id | group_id | info 
1  | 1  | "naughty" 
1  | 2  | "wearing white coat" 
1  | 3  | "broke" 
2  | 1  | "liar" 

यह मजेदार नहीं है ?. लेकिन हाँ, हमें हैस पर काम करना है और कई रिश्तों से संबंधित है। लेकिन सिर्फ एक विचार!

बस एक लिंक तालिका रखने का लाभ ध्यान दिया। का कार्यान्वयन जिसे उसके जवाब में शॉन हिल द्वारा ख्याल रखा जाता है।

0

अपने उपयोगकर्ता मॉडल में एक बूलियन फ़ील्ड मालिक के रूप में जोड़ें, इसलिए उपयोगकर्ता बनाते समय आप असाइन कर सकते हैं यदि वह मालिक है या नहीं।
तो यदि आप समूह के खिलाफ जांच करना चाहते हैं तो आप इसे नीचे कर सकते हैं।

group.users.each do | u |
u.owner?
// तर्क यहाँ जाता है
अंत

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