Per fare ciò che vuoi fare, devi usare uno has_many :through
invece di hatbm
. Vedi here per maggiori informazioni. In breve, la cosa buona è che puoi aggiungere altre variabili alla tabella dei join. Nel tuo caso, un booleano chiamato home_team.
Quindi ecco cosa farei. In primo luogo, creare una tabella di associazione (dal momento che non ho molta fantasia, lo chiamerò partecipazione):
create_table :participations, do |t|
t.integer :game_id, :null => false
t.integer :team_id, :null => false
t.boolean :home_team
end
Come si può vedere, a differenza vostra tavola gamesteams, questo ha un id. E puoi aggiungere attributi ad esso. Poi, vorrei utilizzare questi modelli:
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
in modo da ottenere le squadre di un gioco, si fa @game.teams
.
Ora, per ottenere HOME_TEAM e AWAY_TEAM, aggiungere questi metodi per il vostro modello di gioco:
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
E poi sarete in grado di fare @game.home_team
e @game.away_team
.
modifica di Pietro: Ok, quindi per MySQL dovrete utilizzare diversi dove dichiarazioni:
self.teams.joins (partecipanti): .dove ("? Participants.home_team =" true primo. self.teams.joins (: partecipanti) .where ("participants.home_team IS NULL"). first
Posso usare "=?", vero e "! =?", vero - O - NON È NULL e IS NULL
Penso che per falso dovresti provare a usare where("participants.home_team = ?", false)
Ok, quindi ci sono almeno 2 modi per configurare i tuoi team.
- Si lascia all'utente di scegliere quale squadra sta giocando casa
- utente si assume la prima squadra è la squadra di casa
Se si va per il numero 1, è necessario utilizzare un pulsante di opzione per lasciare che il l'utente decide. Qualcosa di simile a questo:
<%= 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 %>
Quindi, se params[:home_team] == 1
, la prima squadra è la squadra di casa, se params[:home_team] == 2
, la seconda squadra è la squadra di casa.
Se si va per il numero 2, poi, si dovrebbe avere qualcosa di simile nella vostra forma non aggiungere le squadre al vostro gioco:
<%= label_tag :name, 'Home Team' %>
<%= text_field_tag :name, nil, :name => "home[]" %>
<%= label_tag :name, 'Away Team' %>
<%= text_field_tag :name, nil, :name => "away[]" %>
Allora nel vostro controller si può fare qualcosa di simile
@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)
Vuoi veramente che HomeTeam e AwayTeam siano classi separate? E, al momento, tabelle DB separate? – Chowlett
No - è solo un bodge. Probabilmente voglio una tabella games_teams con un boolean home_team che penso ... – pshear0