जो आप करना चाहते हैं, उसे hatbm
के बजाय has_many :through
का उपयोग करना चाहिए। अधिक जानकारी के लिए here देखें। संक्षेप में, अच्छी बात यह है कि आप जॉइन टेबल में अन्य चर जोड़ सकते हैं। आपके मामले में, एक बूलियन home_team कहा जाता है।
तो मैं यहां क्या करूँगा। सबसे पहले, एक संघ तालिका बनाने (के बाद से मैं बहुत कल्पना नहीं है, मैं इसे भागीदारी फोन करता हूँ):
create_table :participations, do |t|
t.integer :game_id, :null => false
t.integer :team_id, :null => false
t.boolean :home_team
end
आप देख सकते हैं, अपने gamesteams तालिका के विपरीत, इस एक एक आईडी है। और आप इसमें विशेषताओं को जोड़ सकते हैं। फिर, मैं इन मॉडलों का प्रयोग करेंगे:
class Participation < ActiveRecord::Base
belongs_to :game
belongs_to :team
end
class Game < ActiveRecord::Base
has_many :participations, :dependent => :destroy
has_many :teams, :through => :participations
end
class Team < ActiveRecord::Base
has_many :participations, :dependent => :destroy
has_many :games, :through => :participations
end
तो एक खेल की टीमों प्राप्त करने के लिए, आप @game.teams
है।
अब, HOME_TEAM और AWAY_TEAM पाने के लिए अपने खेल मॉडल के लिए इन तरीकों जोड़ें:
def home_team
self.teams.joins(:participations).where("participations.home_team IS ?", true).first
end
def away_team
self.teams.joins(:participations).where("participations.home_team IS ?", false).first
end
और फिर आप @game.home_team
और @game.away_team
ऐसा करने में सक्षम हो जाएगा।
पीटर संपादित करें: ठीक है, तो mysql के लिए आप विभिन्न का उपयोग करना होगा जहां बयान:
self.teams.joins (: प्रतिभागियों) .where ("? Participants.home_team =" सच)। सबसे पहले self.teams.joins (: प्रतिभागियों)। कहीं ("प्रतिभागियों.home_team IS NULL")। पहले
मैं या तो "=?", सत्य और "! =?", सत्य का उपयोग कर सकता हूं - या - शून्य नहीं है और आईएस नल
मैं झूठा के लिए लगता है कि तुम इतना तो वहाँ अपनी टीमों स्थापित करने के लिए कम से कम 2 तरीके हैं, where("participants.home_team = ?", false)
ठीक है का उपयोग कर प्रयास करना चाहिए।
- आप उपयोगकर्ता चुनते हैं, जिन टीम घर खेल रहा है
- आप पहली टीम मान लें घरेलू टीम
आप संख्या 1 के लिए जाना है, तो आप एक रेडियो बटन का उपयोग करना चाहिए यह बताने के लिए है उपयोगकर्ता तय करते हैं। कुछ इस तरह:
<%= label_tag :home, 'Home Team' %><br />
<%= label_tag :home_team_1, 'Team 1' %><%= radio_button_tag :home_team, 1 %>
<%= label_tag :home_team_2, 'Team 2' %><%= radio_button_tag :home_team, 2 %>
तो अगर params[:home_team] == 1
वाली पहली टीम घरेलू टीम, है अगर params[:home_team] == 2
, दूसरी टीम घरेलू टीम है।
आप नंबर 2 के लिए जाना है, तो, आप अपने प्रपत्र में कुछ इस तरह अपने खेल के लिए टीमों में शामिल कर सकता होना चाहिए:
<%= label_tag :name, 'Home Team' %>
<%= text_field_tag :name, nil, :name => "home[]" %>
<%= label_tag :name, 'Away Team' %>
<%= text_field_tag :name, nil, :name => "away[]" %>
कुछ
तो फिर अपने नियंत्रक में आप कर सकते हैं की तरह
@game = Game.new(params[:game])
home = Team.create(params[:home])
# or
home = Team.find_or_create_by_name(params[:home][:name])
@game.participations.create(:team_id => home.id, :home_team => true or 1)
away = Team.find_or_create_by_name(params[:away][:name])
@game.participations.create(:team_id => away.id, :home_team => false or 0)
क्या आप वास्तव में होमटेम और एवेटम को अलग-अलग कक्षाएं चाहते हैं? और, वर्तमान में, अलग डीबी टेबल? – Chowlett
नहीं - यह सिर्फ एक बॉज है। मुझे शायद एक games_टेम्स टेबल चाहिए जो home_team बूलियन के साथ मुझे लगता है ... – pshear0