シーズンを通してサッカー チームを追跡するアプリケーションを作成しています。しかし、私はデータベースの設計にこだわっています。1 つのフィクスチャーには、ホーム チームとアウェイ チームがあります。home_team と away_team という 2 つの外部キーを持つフィクスチャ モデルを作成しましたが、関連付けが正しく機能しません。何か案は?各試合はリーグに属しています。
1105 次
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 つのコレクションが得られますが、それらの集約は ruby で行う必要があり、面倒です。
class Team < ActiveRecord::Base
def fixtures(*args)
home_fixtures.all(*args) + away_fixtures.all(*args)
end
end
これにも問題があり、並べ替えと制限はすべてめちゃくちゃになります (へー、しゃれ、誰が知っていましたか?)。
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 は必要なことをしているようです。
もう 1 つのオプションは、named_scope を使用することです。
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
この最後の解決策は、私が固執するものです。これは、読み取り専用の関連付けのように動作:finder_sql
し、さらに先に発生する可能性のある奇抜さを防ぐスコープであるためです (つまり、どうすればさらにマージするかを知ることができますか?条件? サブクエリ、サブクエリを実行することがありますか? ここでは必要ありませんか? )。
お役に立てれば。
于 2009-09-01T12:56:39.863 に答える
0
Team
モデルとモデルがあるとします。Something
後者には と がhome_team_id
ありaway_team_id
ます。
class Something < ActiveRecord::Base
belongs_to :home_team, :class_name => 'Team'
belongs_to :away_team, :class_name => 'Team'
それらをsomething.away_team
および と呼びsomething.home_team
ます。
于 2009-09-01T12:42:59.680 に答える