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 multiple foreign_keys


此外,您可以使用 Team 的 id 从中创建一个类方法(如果您已经拥有 team_id 但没有 Team 实例对象):

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 回答