11

Teams モデルと Fixtures モデルがあります。Fixtures モデルには、アウェイ チームとホーム チームがあります。この回答の例に従い、ほ​​とんどのことが機能しています。

class Fixture < ActiveRecord::Base
  belongs_to :home, class_name: 'Team'
  belongs_to :away, class_name: 'Team'
end


class Team < ActiveRecord::Base
  has_many :home_games, :class_name => 'Fixture', :foreign_key => 'home_id'
  has_many :away_games, :class_name => 'Fixture', :foreign_key => 'away_id'
end

@team.fixtures を呼び出して、すべてのチームのフィクスチャのリストを取得できるようにしたいと考えています。現在、@team.home_games はホーム フィクスチャを提供し、@team.away_games はアウェイ フィクスチャーを提供します。has_many :gamesに似たものを書くにはどうすればよいhas_many :home_gamesですか?それが最善の方法ですか?

4

1 に答える 1

11

そのためのインスタンスメソッドを書くのが最善の方法だと思います:

チーム モデルでは:

def games
  Fixture.where("home_id = ? OR away_id = ?", self.id, self.id)
end

通常の方法のように使用します。

Team.first.games
#=> [<Fixture id: ... >, <Fixture id: ... >, ... ]

これは、スコープチェーンなどに再利用可能なActiveRecord::Relationを返す必要があります。

(これは同様の質問ですが、has_oneRails Model has_many with multipleforeign_keys を使用)


また、チームの id を使用してクラス メソッドを作成することもできます (既に team_id を持っているが、チーム インスタンス オブジェクトを持っていない場合)。

class Team < ActiveRecord::Base
  has_many :home_games, :class_name => 'Fixture', :foreign_key => 'home_id'
  has_many :away_games, :class_name => 'Fixture', :foreign_key => 'away_id'

  def games
    Team.games(self.id)
  end

  def self.games(team_id)
    Fixture.where('fixtures.home_id = ? OR fixtures.away_id = ?', team_id, team_id)    
  end
end

そして、次のように使用します。

Team.games(params[:team_id])
# or
@team = Team.where(id: params[:id]).first
@team.games
于 2013-07-04T18:51:32.550 に答える