Rails has_many自定义ActiveRecord关联

我有一个团队模型和一个夹具模型。 Fixtures模型有一个客队和一支主队。我按照这个答案的例子,让大多数事情都有效。

class Fixture < ActiveRecord::Base belongs_to :home, class_name: 'Team' belongs_to :away, class_name: 'Team' end class Team  '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 :home_gameshas_many :games类似has_many :games ,这是最好的方法吗?

我认为最好的方法是为此编写一个实例方法

在团队模型中:

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

像常规方法一样使用它:

 Team.first.games #=> [, , ... ] 

这应该返回一个ActiveRecord :: Relation ,它可以重用于范围链等。

(这是一个类似的问题,但是使用has_one : Rails模型has_many有多个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