Để làm những gì bạn muốn làm, bạn nên sử dụng has_many :through
thay vì hatbm
. Xem here để biết thêm thông tin. Tóm lại, điều tốt là bạn có thể thêm các biến khác vào bảng kết nối. Trong trường hợp của bạn, một boolean gọi là home_team.
Vì vậy, đây là những gì tôi sẽ làm. Trước tiên, hãy tạo một bảng liên kết (vì tôi không có nhiều trí tưởng tượng, tôi sẽ gọi nó là sự tham gia):
create_table :participations, do |t|
t.integer :game_id, :null => false
t.integer :team_id, :null => false
t.boolean :home_team
end
Như bạn thấy, không giống như bảng gamesteam, thẻ này có id. Và bạn có thể thêm các thuộc tính vào nó. Sau đó, tôi sẽ sử dụng các mô hình này:
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
Vì vậy, để có được các đội bóng của một trò chơi, bạn làm @game.teams
.
Bây giờ, để có được HOME_TEAM và đấu với AWAY_TEAM, thêm các phương pháp để mô hình trò chơi của bạn:
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
Và sau đó bạn sẽ có thể làm @game.home_team
và @game.away_team
.
Phêrô chỉnh sửa: Ok, vậy cho mysql bạn sẽ phải sử dụng khác nhau, nơi báo cáo:
self.teams.joins (: người tham gia) .where ("? Participants.home_team =", true) .first self.teams.joins (: người tham gia) .tại đây ("particip.home_team IS NULL") đầu tiên
Tôi có thể sử dụng "=?", true và "! =?", đúng - HOẶC-- KHÔNG phải là NULL và IS NULL
Tôi cho rằng bạn nên thử sử dụng where("participants.home_team = ?", false)
Ok, do đó, có ít nhất 2 cách để thiết lập nhóm của bạn.
- Bạn cho phép người dùng chọn đội đang chơi nhà
- Bạn phải chịu đội đầu tiên là đội chủ nhà
Nếu bạn đi cho số 1, bạn nên sử dụng một nút radio để cho các người dùng quyết định. Một cái gì đó như thế này:
<%= 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 %>
Vì vậy, nếu params[:home_team] == 1
, nhóm nghiên cứu đầu tiên là đội chủ nhà, nếu params[:home_team] == 2
, nhóm thứ hai là đội chủ nhà.
Nếu bạn đi cho số 2, sau đó, bạn nên có một cái gì đó như thế này trong hình thức của bạn làm thêm các đội bóng đến trò chơi của bạn:
<%= label_tag :name, 'Home Team' %>
<%= text_field_tag :name, nil, :name => "home[]" %>
<%= label_tag :name, 'Away Team' %>
<%= text_field_tag :name, nil, :name => "away[]" %>
Vì vậy, sau đó trong bộ điều khiển của bạn, bạn có thể làm điều gì đó như
@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)
Bạn có thực sự muốn HomeTeam và AwayTeam trở thành các lớp riêng biệt không? Và, hiện tại, các bảng DB riêng biệt? – Chowlett
Không - nó chỉ là một nhà nghỉ. Tôi có thể muốn một bảng games_teams với một boolean home_team tôi nghĩ rằng ... – pshear0