Rails 个具有单一 Table 继承和 HABTM 的模型

Rails models with Single Table Inheritance and HABTM

我有一个包含 2 个模型的项目,游戏和团队。一场比赛有两支球队,一支客队和一支主队。有一定数量的团队(不再创建),每个团队将属于许多游戏。

我希望能够做到@game.home_team.name而不是@game.teams.find_by_id(@game.home_team_id).first.name。我不确定我是否可以在不创建两个额外的模型 AwayTeam 和 HomeTeam 的情况下做到这一点,除了额外的 :game_id 和可能的 :type.

之外,它们将具有与 Team 相同的列

目前 Games 和 Teams 之间的 HABTM 关系有效,但一旦它属于游戏,我无法将 Team 变成 HomeTeam 或 AwayTeam。

game.rb

class Game < ActiveRecord::Base
  has_and_belongs_to_many :teams
  has_one :away_team, -> {where(type:'away')}, class_name: 'Team' 
  has_one :home_team, -> {where(type:'home')}, class_name: 'Team'
end

team.rb

class Team < ActiveRecord::Base

  has_and_belongs_to_many :games
  # has_many :away_teams
  # has_many :home_teams
end

###

# class AwayTeam < Team
#   belongs_to :game
#   belongs_to :team
# end
# class HomeTeam < Team
#   belongs_to :game
#   belongs_to :team
# end

games_controller.rb

def create
  @game = Game.create(game_params)
  @game.teams << Team.find_all_by_id([ @game.away_team_id, @game.home_team_id ])
  @game.away_team = @game.teams.find_by_id(@game.away_team_id)
  @game.home_team = @game.teams.find_by_id(@game.home_team_id)
  @game.save
end

非常感谢任何帮助,谢谢。

尝试添加一个额外的模型 GameTeam 并使 has_many :through 关系

  class GameTeam
    belongs_to :game
    belongs_to :team
    validates :team_type, presence: true
  end

  class Game
    has_many :game_teams
    has_may :teams, through: :game_teams
  end

然后你可以game.teams获取所有团队。您还可以通过 GameTeam 类型

实现方法的范围以回家或离开团队