Rails - 将一个模型中的两个不同字段关联为一个关联

时间:2013-11-20 20:49:52

标签: ruby-on-rails foreign-keys ruby-on-rails-4 model-associations

我的游戏模型上有两个字段,home_team_id和away_team_id。

我想把这两个领域联系起来作为与游戏相关的团队。

这些团队可以属于多个游戏,所以我拥有团队模型

has_many :games

我不确定在我的游戏模型上放什么。

has_many :teams

不起作用,因为它不知道要查找home_team_id和away_team_id。有没有办法告诉它团队有两个不同的关键?

我也试过这个,但它也不起作用。

has_one :away_team, :class_name => 'Team', :foreign_key => 'id'
has_one :home_team, :class_name => 'Team', :foreign_key => 'id'

最后我只想在控制台中运行@ game.teams,让主队和客队返回。

2 个答案:

答案 0 :(得分:3)

假设您已经创建了游戏迁移,例如:

class CreateGames < ActiveRecord::Migration
  def change
    create_table :games do |t|
      t.integer :home_team_id
      t.integer :away_team_id

      t.timestamps
    end
  end
end

您可以通过指定模型来存档它:

class Game < ActiveRecord::Base
  belongs_to :away_team, class_name: 'Team', foreign_key: 'away_team_id'
  belongs_to :home_team, class_name: 'Team', foreign_key: 'home_team_id'

  def teams
    [away_team, home_team]
  end
end

答案 1 :(得分:1)

也许你会发现这有点用处:

游戏迁移:

class CreateGames < ActiveRecord::Migration
  def change
    create_table :games do |t|
      t.date :match_date

      t.timestamps
    end
  end
end

团队迁移:

class CreateTeams < ActiveRecord::Migration
  def change
    create_table :teams do |t|
      t.string :name

      t.timestamps
    end
  end
end

模型Game

class Game < ActiveRecord::Base
  belongs_to :home_team, :class_name => "Team"
  belongs_to :away_team, :class_name => "Team"

  # helper for teams
  def teams
    [home_team, away_team]
  end
end

添加参考

class AddReferences < ActiveRecord::Migration
  def change
    change_table :games do |t|
      t.integer :home_team_id
      t.integer :away_team_id
    end
  end
end

在控制台中:

Team.new(name: 'foo').save

Team.new(name: 'bar').save

Game.new(home_team: Team.first, away_team: Team.last).save

Game.first
# => #<Game id: 1, match_date: nil, created_at: "2013-11-20 21:53:41", updated_at: "2013-11-20 21:53:41", home_team_id: 1, away_team_id: 6>

Game.first.teams
# => [#<Team id: 1, name: "foo", created_at: "2013-11-20 21:40:19", updated_at: "2013-11-20 21:40:19">, #<Team id: 2, name: "bar", created_at: "2013-11-20 21:53:12", updated_at: "2013-11-20 21:53:12">]