2 belongs_to,1 has_many:团队/游戏关系

时间:2015-12-21 18:13:47

标签: ruby-on-rails activerecord has-many

我有两个模特游戏和团队:

    class Game < ActiveRecord::Base
      belongs_to :home_team, class_name: 'Team', required: true
      belongs_to :visitor_team, class_name: 'Team', required: true
    end

    class Team < ActiveRecord::Base
      has_many :games
    end

关系has_many:游戏不起作用(我必须指定class_name,但在这种情况下我有两个类名)。我必须区分家庭和访客。

关于如何设计这个的任何想法?

由于

2 个答案:

答案 0 :(得分:0)

您必须指定foreign_key,假设home_team_id表中有visitor_team_idgames列:

has_many :home_games, class_name: 'Game', foreign_key: :home_team_id
has_many :visitor_games, class_name: 'Game', foreign_key: :visitor_team_id

答案 1 :(得分:0)

has_many会查找与您正在使用的班级同名的外键。

在这种情况下,Rails会假设关联的team_id类中有一个Game,链接回团队。但情况并非如此,因此您需要更加明确

在这种情况下,您还没有从游戏回到团队的单个链接。 Game和Team之间有两个不同的链接,因此您需要将这两个链接表示为关联:

class Team < ActiveRecord::Base
  has_many :home_games, class_name: 'Game', foreign_key: :home_team_id
  has_many :visitor_games, class_name: 'Game', foreign_key: :visitor_team_id
end

如果您希望获得特定团队的所有游戏,无论他们是家庭游戏还是访问游戏,您都可以定义一种方法:

class Team < ActiveRecord::Base
  has_many :home_games, class_name: 'Game', foreign_key: :home_team_id
  has_many :visitor_games, class_name: 'Game', foreign_key: :visitor_team_id

  def games
    Game.where('home_team_id = ? or visitor_team_id = ?', id, id)
  end
end