使用两个与同一模型有一个关系

时间:2013-11-03 00:45:01

标签: ruby-on-rails ruby-on-rails-4 has-many has-one

我正在努力寻找与团队相关的游戏模型的最佳方式。

最终目标是能够调用以下内容:

@game.winner
@game.loser
@team.games

前两个关系正在发挥作用,但游戏不是。使用has_many(见下文),我得到ERROR: column games.team_id does not exist我通常会使用与:foreign_key => winner_id相同的任何内容来处理,但我如何检查winner_id和{{1} }?

是团队模型中创建方法的唯一选择:

loser_id

到目前为止,我正在做的是:

def games
  won = Game.where(:winner => id)
  lost = Game.where(:loser => id)
  won + lost
end

1 个答案:

答案 0 :(得分:2)

你没有多说这个问题。但我认为你工作太辛苦了。如果一个团队可以玩几个游戏而一个游戏包含多个团队,那么你需要多对多的关系。这需要第三个表,最佳实践是has_many :through关系。它看起来像:

class Game < ActiveRecord::Base
  has_many :teams, through: assignment
  has_one :winner, class_name: 'Team', through: :assignment, order: 'score DESC'
  has_one :loser,  class_name: 'Team', through: :assignment, order: 'score ASC'
end

class Team
  has_many :games, through: :assignment
end

class Assignment < ActiveRecord::Base
  belongs_to :game
  belongs_to :team
end

现在您拥有赢家和输家属性,但您不需要使用自己的方法为团队计算游戏。只需说出team.games.count,同样game.teams就是指派给游戏的团队。