为了达到你想要的效果,你应该使用
has_many :through
而不是
hatbm
。在这里查看更多信息:
here。简言之,好处是你可以将其他变量添加到连接表中。在你的情况下,一个名为home_team的布尔变量。
所以这是我会做的事情。首先,创建一个关联表(因为我没有太多想象力,所以我会称其为participation):
create_table :participations, do |t|
t.integer :game_id, :null => false
t.integer :team_id, :null => false
t.boolean :home_team
end
正如您所见,与您的游戏团队表不同,这个表有一个 id。您可以向其添加属性。
然后,我会使用这些模型:
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
。
现在,为了获取主队和客队,请将以下方法添加到您的Game模型中:
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,您需要使用不同的where语句:
self.teams.joins(:participants).where("participants.home_team = ?", true).first
self.teams.joins(:participants).where("participants.home_team IS NULL").first
我可以使用“=?”,true和“!=?”,true - 或者IS NOT NULL和IS NULL。
我认为对于false,您应该尝试使用
where("participants.home_team = ?", false)
好的,至少有两种设置团队的方法。
1.让用户选择主场球队。
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
,则第二个球队是主队。
如果您选择第二个选项,请在表单中添加以下内容以将球队添加到比赛中:
<%= 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])
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)