具有单表继承和HABTM的Rails模型

时间:2015-02-03 15:57:10

标签: ruby-on-rails ruby relationships single-table-inheritance

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

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

目前,游戏和团队之间的HABTM关系有效,但一旦属于游戏,我无法将团队变成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

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

1 个答案:

答案 0 :(得分:1)

尝试添加一个额外的模型GameTeam并制作has_many:通过关系

  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类型

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