2012-01-27 72 views
4

我的问题的一个示例是体育游戏。体育比赛有两支球队,一支主队和一支客场球队。我的活动记录型号如下:Rails关联 - 与同一类的多个has_one关系

class Team < ActiveRecord::Base 

    belongs_to :game 

end 

class Game < ActiveRecord::Base 

    has_one :home_team, :class_name => "Team" 
    has_one :away_team, :class_name => "Team" 

end 

我希望能够通过比赛来访问一个团队,例如:Game.find(1).home_team

但我得到一个未初始化常数错误:Game :: team。谁能告诉我我做错了什么?谢谢,

+0

如果'Team ... belongs_to:game',一个团队只能玩一个游戏。你可能想要'has_many:games' – jlundqvist 2012-01-27 18:46:23

回答

1

我只是测试你的代码,它应该工作。

我怀疑你的文件名是错误的。确保您在app /模型文件名/是:

  • game.rb
  • team.rb

,而不是:

  • games.rb

  • teams.rb
1

我认为这可能是您的架构的错误。

游戏无法区分两个团队与此架构。

所以,请运行像

rails g migration add_stadium_to_game stadium:integer 
rails g migration add_home_to_team home:integer 
rake db:migrate 

,并编辑“game.rb”这样的

class Game < ActiveRecord::Base 

    has_many :teams 

    def home_team 
    teams.select { |team| team.home == self.stadium }.first 
    end 

    def away_team 
    teams.select { |team| team.home != self.stadium }.first 
    end 

end 

五言这一点是一个例子,所以有实现自己的目的,许多方面。

7

如果Game has_one :team那么Rails会假设您的团队表有一个game_id列。你想要的是为游戏桌拥有一个team_id列,在这种情况下,你会使用Game belongs_to :team。就像英语一样,在这种情况下听起来倒退,但是作为Ruby,这是正确的。

我确实简化了一点。你想要的东西是这样的:

class Team < ActiveRecord::Base 
    has_many :home_games, :class_name => "Game", :foreign_key => 'home_team_id' 
    has_many :away_games, :class_name => "Game", :foreign_key => 'away_team_id' 
end 

class Game < ActiveRecord::Base 
    belongs_to :home_team, :class_name => "Team" 
    belongs_to :away_team, :class_name => "Team" 
end