2012-01-27 73 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