2009-11-10 13 views
6

मैं पहले has_and_belongs_to_many का उपयोग कर रहा था, और has_many में बदल गया है: के माध्यम से। यहां बताया गया है कि यह गेम की एक सूची की तलाश कैसे करता है जिसमें कई उपयोगकर्ता खेल सकते हैं। इस के साथ, मैं game.users और user.games कर सकते हैं ....:has_many: प्रश्नों के माध्यम से

class Game < ActiveRecord::Base 
has_many :game_users, :dependent => :destroy 
has_many :users, :through => :game_users, :uniq => true 
end 

class User < ActiveRecord::Base 
has_many :game_users, :dependent => :destroy 
has_many :games, :through => :game_users, :uniq => true 
end 

class GameUser < ActiveRecord::Base 
    belongs_to :game 
    belongs_to :user 
end 

और में शामिल होने तालिका के लिए अपने डेटाबेस माइग्रेशन:

create_table :game_users, :id => false do |t| 
     t.column :game_id, :integer 
     t.column :user_id, :integer 
     t.column :player_index, :integer 
    end 

मैं नहीं कर रहा हूँ काफी यकीन है कि मैं सब मिल यह, कृपया मुझे अपने तथ्यों की जांच करने में मदद करें:

  1. निर्भर है =>: सही नष्ट करें? मैं चाहता हूं कि गेम गेम या उपयोगकर्ता नष्ट हो जाने पर 'game_users' तालिका प्रविष्टि को हटाया जाए - लेकिन मैं नहीं चाहता कि उपयोगकर्ता हटाए जाएं और गेम इसके विपरीत .....?

  2. यूनिक फ़ील्ड कहता है कि गेम में केवल अद्वितीय उपयोगकर्ता होते हैं, और उपयोगकर्ताओं में केवल अद्वितीय गेम होते हैं। क्या वो सही है?

  3. डेटाबेस माइग्रेशन पहले जैसा है: id => false। क्या यह अभी भी सही काम है? मैंने कंसोल में एक गेम को नष्ट करने की कोशिश की, और लापता आईडी के बारे में शिकायतें मिलीं ... इसलिए मैं अनुमान लगा रहा हूं और समझने की कोशिश क्यों कर रहा हूं।

मुझे रेल सक्रिय सक्रिय संघों को बहुत भ्रमित लगता है। मुझे लगता है कि वे नहीं होना चाहिए!

+0

आपका उपयोग: निर्भर =>: नष्ट सही है। –

उत्तर

5

1: हाँ, यह सही

2 है: documentation on uniq से:

अगर सही है तो डुप्लिकेट संग्रह से लोप हो जाएगा। में प्रयोग के साथ: के माध्यम से उपयोगी।

तो, हाँ, यदि आपका लक्ष्य उपयोगकर्ता के गेम-संग्रह में एक ही गेम नहीं है और न ही गेम के उपयोगकर्ता-संग्रह में एक ही उपयोगकर्ता है, तो यह सही है। यह सब here समझाया गया है।

हालांकि, यह डुप्लिकेट गेमयूसर को बनाए जाने से रोक नहीं पाएगा। उसके लिए, आपको GameUser मॉडल में validates_ uniqueness _of उपयोग करने की आवश्यकता होगी:

class GameUser < ActiveRecord::Base 
    validates_uniqueness_of :game_id, :scope => :user_id 
end 

3: नहीं, आप का उपयोग नहीं करना चाहते हैं: आईडी => झूठी किसी भी अधिक। Has_and_belongs_to_many से has_many में स्विच करके: आपने अपने कई से कई जॉइन-टेबल को एक पूर्ण मॉडल - गेम यूज़र में प्रचारित किया है - जिसके लिए अपनी आईडी की आवश्यकता है।

हालांकि यह पुराना है, this अभी भी है_मनी समझने के लिए एक अच्छा लेख है।

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