Has_many:通过Rails。我可以有两个外键吗?

时间:2012-02-05 05:49:54

标签: ruby-on-rails ruby

我是一名铁杆新手,我正在尝试创建一个如下所示的数据库架构:

有很多比赛。每场比赛有2支球队。

一支球队有很多比赛。

团队模型和匹配模型通过竞赛表连接在一起。

我的竞赛模型有match_id,team1_id和team2_id。

但我不知道如何完成这项工作,或者它是否是最好的方法。我不知道如何让某些团队team1和其他team2 ....两个外键?那可能吗?

匹配表还需要保存其他数据,如team1_points和team2_points,赢家和输家等。

2 个答案:

答案 0 :(得分:2)

您可以在表格中包含任意数量的外键。我写了一个应用程序,涉及安排团队在游戏中玩。

我在Game类中使用以下方法处理此问题的方式:

class Game < ActiveRecord::Base
  belongs_to :home_team, :class_name => 'Team', :foreign_key => 'team1_id'
  belongs_to :visitor_team, :class_name => 'Team', :foreign_key => 'team2_id'

您可以为team1_points,team2_points等添加适当的字段。您需要使用以下内容设置您的团队模型:

class Team < ActiveRecord::Base
  has_many :home_games, :class_name => 'Game', :foreign_key => 'team1_id'
  has_many :visitor_games, :class_name => 'Game', :foreign_key => 'team2_id'

  def games
    home_games + visitor_games
  end

  #important other logic missing
end

请注意,我的一些命名约定是必须使用旧数据库的结果。

答案 1 :(得分:1)

我遇到了类似的问题,并扩展了之前的答案,我所做的是:

class Game < ActiveRecord::Base

  def self.played_by(team)
    where('team1_id = ? OR team2_id = ?', team.id, team.id)
  end
end

class Team < ActiveRecord::Base

  def games
    @games ||= Game.played_by(self)
  end
end

这样,Team#games会返回ActiveRecord::Relation而不是Array,因此您可以继续链接其他范围。