Модели Rails с наследованием одной таблицы и HABTM

У меня есть проект с 2 моделями, Game и Team. В Игре участвуют две Команды, команда гостей и команда хозяев. Существует определенное количество команд (больше не создаются), и каждая из них будет принадлежать многим играм.

Я хочу иметь возможность использовать @game.home_team.name вместо @game.teams.find_by_id(@game.home_team_id).first.name. Я не уверен, что смогу сделать это без создания двух дополнительных моделей, AwayTeam и HomeTeam, которые будут иметь те же столбцы, что и Team, за исключением дополнительного :game_id и, возможно, :type.

В настоящее время отношения HABTM между играми и командами работают, но у меня нет возможности превратить команду в домашнюю или выездную команду, если она принадлежит игре.

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

Любая помощь будет очень признательна, спасибо.


person user3185958    schedule 03.02.2015    source источник


Ответы (1)


Попробуйте добавить еще одну модель 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.

person Stanislav Mekhonoshin    schedule 03.02.2015