2013-11-03 34 views
0

我试图找到模拟与团队相关的游戏的最佳方法。使用两个关系到同一个模型

的最终目标是能够调用的东西,如:

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

前两种关系的工作,但游戏之一是没有的。使用has_many(见下文),我得到ERROR: column games.team_id does not exist,我通常会使用任何与:foreign_key => winner_id等效的东西来解决问题,但是如何才能将它同时结帐到winner_idloser_id

是队中的模型来创建一个方法,像这样唯一的选择:

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

到目前为止,我在做什么是:

class Game < ActiveRecord::Base 
    has_one :winner, class_name: "Team" 
    has_one :loser, class_name: "Team" 
end 


class Team 
    has_many :games 
    # or something that actually works 
end 
+0

可能的重复:http://stackoverflow.com/questions/11873011/rails-admin-column-does-not-exist – Waclock

+0

不,我的是,但我想两个外键 –

+1

但实际上可能是重复的http://stackoverflow.com/questions/307581/rails-model-has-many-with-multiple-foreign-keys –

回答

1

你没有说太多关于问题。但我认为你工作太辛苦了。如果一个团队可以玩几个游戏,而一个游戏包含多个团队,那么你需要一个多对多的关系。这需要第三张表格,最佳做法是与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.countgame.teams是分配到游戏的团队。

+0

所以我必须为连接表添加一个迁移? –

+1

那么,你真的想生成一个模型,而不仅仅是一个迁移。 'rails g model分配游戏:引用团队:引用' – Gene

相关问题