Para hacer lo que quiere hacer, debe usar un has_many :through
en lugar de hatbm
. Ver here para más información. En resumen, lo bueno es que puede agregar otras variables a la tabla de combinaciones. En tu caso, un booleano llamado home_team.
Así que esto es lo que haría. En primer lugar, crear una tabla de asociación (ya que no tengo mucha imaginación, voy a llamarlo participación):
create_table :participations, do |t|
t.integer :game_id, :null => false
t.integer :team_id, :null => false
t.boolean :home_team
end
Como se puede ver, a diferencia de su mesa gamesteams, éste tiene un ID. Y puedes agregarle atributos. Entonces, me gustaría utilizar estos modelos:
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
Así que para los equipos de un juego, lo hace @game.teams
.
Ahora, para obtener HOME_TEAM y AWAY_TEAM, añadir estos métodos para su modelo de juego:
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
Y entonces usted será capaz de hacer @game.home_team
y @game.away_team
.
edición de Pedro: Ok, así que para MySQL tendrá que utilizar diferentes donde declaraciones:
self.teams.joins (participantes): .donde ("? Participants.home_team =", verdadera) .primero self.teams.joins (: participantes) .where ("participantes.home_team IS NULL"). Primero
Puedo usar "=?", verdadero y "! =?", verdadero - OR-- NO ES NULO y ES NULO
Creo que es falso, debe intentar usar where("participants.home_team = ?", false)
Ok, entonces hay al menos 2 formas de configurar sus equipos.
- deja que el usuario elegir qué equipo está jugando en casa
- usted asume el primer equipo es el equipo local
Si vas para el número 1, se debe utilizar un botón de opción para permitir la el usuario decide Algo como esto:
<%= 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 %>
Así que si params[:home_team] == 1
, el primer equipo es el equipo local, si params[:home_team] == 2
, el segundo equipo es el equipo local.
Si vas para el número 2, a continuación, usted debe tener algo como esto en su forma no agregar los equipos a su juego:
<%= label_tag :name, 'Home Team' %>
<%= text_field_tag :name, nil, :name => "home[]" %>
<%= label_tag :name, 'Away Team' %>
<%= text_field_tag :name, nil, :name => "away[]" %>
Así que en su controlador puede hacer algo como
@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)
¿Realmente desea que HomeTeam y AwayTeam sean clases separadas? Y, en la actualidad, ¿tablas de DB separadas? – Chowlett
No, es solo una burla. Probablemente quiero una tabla games_teams con un booleano home_team, creo ... – pshear0