Чтобы сделать то, что вы хотите, вы должны использовать has_many :through
вместо hatbm
. См. здесь для получения дополнительной информации. Короче говоря, хорошо, что вы можете добавить другие переменные в таблицу соединений. В вашем случае логическое значение home_team.
Так вот, что бы я сделал. Во-первых, создайте таблицу ассоциаций (так как у меня не так много воображения, я назову это участием):
create_table :participations, do |t|
t.integer :game_id, :null => false
t.integer :team_id, :null => false
t.boolean :home_team
end
Как видите, в отличие от вашей таблицы игровых команд, у этого есть идентификатор. И вы можете добавить атрибуты к нему.
Тогда я бы использовал эти модели:
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 (: members) .where ("members.home_team =?", True) .first
self.teams.joins (: members) .where ("members.home_team IS NULL"). first
Я могу использовать "=?", True и "! =?", True --OR-- NOT NULL и
ЕСТЬ НУЛЬ
Я думаю, что для false вы должны попробовать использовать where("participants.home_team = ?", false)
Хорошо, так что есть как минимум 2 способа настроить ваши команды.
- Вы позволяете пользователю выбирать, какая команда играет дома
- Вы предполагаете, что первая команда - хозяева
Если вы выберете номер 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)