我有一个 has_many :through 关联。球员有很多球队,球队有很多球员。加入模型 Affiliation 属于 Players 和 Teams,并且还具有每年year
跟踪玩家的团队隶属关系(或就业)的属性。
我似乎无法根据以下规则找出建立关联的正确方法:
- 创建一个新玩家。
- 关联一个可能是新的或现有的团队。所以找到它或创建它,但只有在保存玩家时才创建它。
- 关联可能包括也可能不包括一年,但只有在保存球员和球队的情况下才能创建关联。
Player 模型如下所示:
class Player < ActiveRecord::Base
attr_accessible :name
has_many :affiliations, :dependent => :destroy
has_many :teams, :through => :affiliations
end
团队模型如下所示:
class Team < ActiveRecord::Base
attr_accessible :city
has_many :affiliations, :dependent => :destroy
has_many :players, :through => :affiliations
end
隶属关系模型如下所示:
class Affiliation < ActiveRecord::Base
attr_accessible :player_id, :team_id, :year
belongs_to :player
belongs_to :team
end
我已经成功地使用 PlayersController 中的创建操作创建了没有连接模型属性的关联记录,如下所示:
class PlayersController < ApplicationController
def create
@player = Player.new(params[:player].except(:teams))
unless params[:player][:teams].blank?
params[:player][:teams].each do |team|
team_to_associate = Team.find_or_initialize_by_id(team[:id], team.except(:year)
@player.teams << team_to_associate
end
end
@player.save
respond_with @player
end
end
使用以下参数创建具有两支球队的新球员后:
{"player"=>{"name"=>"George Baker", "teams"=>[{"city"=>"Buffalo"}, {"city"=>"Detroit"}]}}
数据库看起来像:
球员
id:1,姓名:George Baker
团队
id:1,城市:布法罗
id:2,城市:西雅图
隶属关系
id: 1, player_id: 1, team_id: 1, year: null
id: 2, player_id: 1, team_id: 2, year: null
当我试图介绍这一年时,事情就崩溃了。我最近在 PlayersController 中创建操作的尝试如下所示:
class PlayersController < ApplicationController
def create
@player = Player.new(params[:player].except(:teams))
unless params[:player][:teams].blank?
params[:player][:teams].each do |team|
team_to_associate = Team.find_or_initialize_by_id(team[:id], team.except(:year)
// only additional line...
team_to_associate.affiliations.build({:year => team[:year]})
@player.teams << team_to_associate
end
end
@player.save
respond_with @player
end
end
现在,当使用以下参数创建具有两支球队的新球员时:
{"player"=>{"name"=>"Bill Johnson", "teams"=>[{"id"=>"1"}, {"city"=>"Detroit", "year"=>"1999"}]}}
数据库看起来像:
球员
id:1,姓名:George Baker
id:2,姓名:Bill Johnson
团队
id:1,城市:布法罗
id:2,城市:西雅图
id:3,城市:底特律
隶属关系
id: 1, player_id: 1, team_id: 1, year: null
id: 2, player_id: 1, team_id: 2, year: null
id: 3, player_id: 2, team_id: 1, year: null
id: 4, player_id: null, team_id: 3, 年份: 1999
id: 5, player_id: 2, team_id: 3, year: null
因此,在应该只创建两个的情况下创建了三个记录。隶属关系记录 id: 3 是正确的。对于 id: 4,缺少 player_id。对于 id: 5,缺少年份。
显然这是不正确的。我哪里错了?
谢谢