gpt4 book ai didi

ruby-on-rails - Rails 3.2.2-has_many通过

转载 作者:行者123 更新时间:2023-12-04 18:12:46 25 4
gpt4 key购买 nike

试图重构代码以提供干净的关联

一个游戏有一个HOME_TEAM和AWAY_TEAM

一个TEAM有许多GAMES作为HOME_TEAM或AWAY_TEAM

GAME和TEAM之间的关联是直接的HABTM BUT,但我需要指出与GAME相关联的两个TEAMS中的哪个是HOME_TEAM,哪个是AWAY_TEAM。我通过添加额外的字段和关联来做到这一点,但这显然很湿而不是干。我知道答案是正确的,但是我似乎已经崩溃了,无法完全解决这个问题。

基本上,我希望能够做Game.teams(返回两个团队的集合)和Game.home_team(将TEAM设置为home_team)和Game.away_team(将TEAM设置为away_team)

很抱歉提出这样一个简单明了的查询,但它离我远了

class Game < ActiveRecord::Base
belongs_to :home_team
belongs_to :away_team
has_and_belongs_to_many :teams
end

class HomeTeam < ActiveRecord::Base
belongs_to :team
has_one :games
end

class AwayTeam < ActiveRecord::Base
belongs_to :team
has_one :games
end

class Team < ActiveRecord::Base
has_and_belongs_to_many :games
has_many :away_teams
has_many :home_teams
end

所有帮助表示赞赏

彼德

最佳答案

要执行您想做的事情,您应该使用has_many :through而不是hatbm。有关更多信息,请参见here。简而言之,好处是您可以将其他变量添加到联接表中。在您的情况下,一个名为home_team的 bool 值。

所以这就是我要做的。首先,创建一个关联表(由于我没有太多的想象力,因此将其称为参与):

create_table :participations, do |t|
t.integer :game_id, :null => false
t.integer :team_id, :null => false
t.boolean :home_team
end

如您所见,与您的gameteams表不同,该表具有一个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

现在,要获得home_team和away_team,请将以下方法添加到您的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

Peter's edit: Ok, so for mysql you'll have to use different where statements:

self.teams.joins(:participants).where("participants.home_team = ?", true).first self.teams.joins(:participants).where("participants.home_team IS NULL").first

I can either use " = ?", true and "!= ?", true --OR-- IS NOT NULL and IS NULL



我认为如果是假的,您应该尝试使用 where("participants.home_team = ?", false)
好的,所以至少有两种方法可以组建您的团队。
  • 您让用户选择哪个球队在主场作战
  • 您假设第一支球队是主队

  • 如果您选择数字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[]" %>

    因此,在您的 Controller 中,您可以执行以下操作
    @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)

    关于ruby-on-rails - Rails 3.2.2-has_many通过,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9821781/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com