1

シーズンを通してサッカー チームを追跡するアプリケーションを作成しています。しかし、私はデータベースの設計にこだわっています。1 つのフィクスチャーには、ホーム チームとアウェイ チームがあります。home_team と away_team という 2 つの外部キーを持つフィクスチャ モデルを作成しましたが、関連付けが正しく機能しません。何か案は?各試合はリーグに属しています。

4

2 に答える 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 に答える