2009-09-01 17 views
1

私は、シーズン中にサッカーチームを追跡するためのアプリケーションを作成しています。しかし、私はデータベースの設計に固執しています。 1つのフィクスチャにホームチームとアウェイチームがあります。 home_teamとaway_teamの2つの外部キーを持つフィクスチャー・モデルを作成しましたが、正しく機能するように関連付けを取得できません。何か案は?各灯具はリーグに属します。複数のレベルでの関連付け

答えて

7

簡単な答えは次のとおりです。

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

class Team < ActiveRecord::Base 
    has_many :fixtures 
end 

しかしTeam.fixturesが動作しませんので、これはあなたの場合は無意味です。

class Team < ActiveRecord::Base 
    has_many :home_fixtures, :class_name => "Fixtures", :foreign_key => :home_team 
    has_many :away_fixtures, :class_name => "Fixtures", :foreign_key => :away_team 
end 

は2つのコレクションを提供しますが、それらを集約することはルビーで起こる必要があります。これは厄介です。

class Team < ActiveRecord::Base 
    def fixtures(*args) 
    home_fixtures.all(*args) + away_fixtures.all(*args) 
    end 
end 

これには問題があります。並べ替えと制限がすべてまとめられています(heh、a pun、who know?)。

class Team < ActiveRecord::Base 
    has_many :fixtures, :finder_sql => 'SELECT * FROM fixtures where (home_team = #{id} or away_team = #{id})' 
    has_many :home_fixtures, :class_name => "Fixtures", :foreign_key => :home_team 
    has_many :away_fixtures, :class_name => "Fixtures", :foreign_key => :away_team 
end 

これは醜いですが、うまくいくかもしれません。 finder_sqlは必要な処理を行っているようです。

他のオプションはnamed_scopeを使用することです。それは非常に読み取り専用の協会のように動作します範囲だし、:finder_sqlを防ぐため

class Fixture < ActiveRecord::Base 
    named_scope :for_team_id, lambda{|team_id| {:conditions => ['(home_team = ? or away_team = ?)', team_id, team_id]} } 
    belongs_to :home_team, :class_name => "Team", :foreign_key => :home_team 
    belongs_to :away_team, :class_name => "Team", :foreign_key => :away_team 
end 

class Team < ActiveRecord::Base 
    def fixtures 
    Fixtures.for_team_id(id) 
    end 
end 

この最後の解決策は、私はに固執したいものです(実際にはどういう意味ですか?より多くの条件をマージする方法を知っていますか?サブクエリ、サブクエリを行うことがありますか?

これが役に立ちます。

0

TeamモデルとSomethingモデルがあるとします。後者はhome_team_idaway_team_idとなります。

class Something < ActiveRecord::Base 
    belongs_to :home_team, :class_name => 'Team' 
    belongs_to :away_team, :class_name => 'Team' 

あなたはsomething.away_teamsomething.home_teamとしてそれらを参照します。

関連する問題