2012-01-27 21 views
4

私の問題の例はスポーツゲームです。スポーツゲームには、ホームチームとアウェイチームという2つのチームがあります。 Game.findは、(1)Rails Associations - 同じクラスに対する複数のhas_one関係

を.home_teamしかし、私は初期化されない定数を取得しています:私は、例えば、ゲームを通じてチームにアクセスできるようにしたい

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 

次のように私のアクティブレコードモデルがありますエラー:ゲーム::チーム。誰かが私が間違っていることを教えてもらえますか?おかげで、

+0

チームが「belongs_to:game」の場合、チームは1つのゲームしかプレイできません。あなたはおそらく 'has_many:games' – jlundqvist

答えて

1

私はちょうどあなたのコードをテストし、それが動作するはずです。私は疑う何

は、ファイル名が間違っているということです。アプリ/モデルのあなたのファイル名/であることを確認してください:

  • games.rb

    :team.rb

なく

  • game.rb
  • または

  • チーム.rb
1

あなたのアーキテクチャの間違いかもしれないと思います。

ゲームでは、このアーキテクチャで2つのチームを区別することはできません。

だから、讲义1コースの

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 

のように、その

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

のように実行してくださいと、編集「game.rb」これは一例ですので、あなたの目的を実現するための多くの方法があります。

7

Game has_one :teamの場合、Railsはチームテーブルにgame_idカラムがあるとみなします。あなたが望むのは、game_dテーブルに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