我有一个has_many:through关联。球员有很多球队,球队有很多球员。加盟模式Affiliation属于玩家和团队,并且还具有一个year
属性来跟踪玩家每年的团队隶属关系(或就业)。为rails 3创建的不正确的数据库记录has_many:通过关联
我似乎无法找出建立基于以下规则具有关联关系的正确方法:
- 创建一个新的球员。
- 将可能是新的或现有的团队关联起来。所以找到它或创建它,但只有在玩家被保存时才创建它。
- 该协会可能会也可能不会包含一年,但只有在保存球员和球队时才应创建该协会。
玩家模型是这样的:
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
我已经成功地创建没有连接模型属性的关联记录
{"player"=>{"name"=>"George Baker", "teams"=>[{"city"=>"Buffalo"}, {"city"=>"Detroit"}]}}
数据库看起来像:
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
使用PARAMS像两队创建一个新的播放器后:唱的,看起来像PlayersController创建行动
球员
个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
现在,使用PARAMS像两队创建一个新的播放器时:
{"player"=>{"name"=>"Bill Johnson", "teams"=>[{"id"=>"1"}, {"city"=>"Detroit", "year"=>"1999"}]}}
数据库的样子:
玩家
ID:1,名称:乔治贝克
ID:2,名称:比尔·约翰逊
队
ID:1,城市:布法罗
ID:2,城市:西雅图
ID:3,城市:底特律
从属关系
ID:1,player_id:1,TEAM_ID:1,年:零
ID:2,player_id:1,TEAM_ID:2年:零
ID:3,player_id:2 ,TEAM_ID:1,年:空
ID:4,player_id:空,TEAM_ID:3,年:1999
ID:5,player_id:2,TEAM_ID:3,年:空
因此,只有两个应该创建的三个记录。联盟记录ID:3是正确的。对于id:4,player_id丢失。而对于id:5,这一年不见了。
显然这是不正确的。我哪里错了?
感谢
我试过了,它确实有效。所以谢谢!但我很好奇,有没有一种方法可以建立关联,以便“@ group.save”保存所有内容? – glevine
它取决于,我不知道@group是什么,我只是复制/粘贴它从你的答案 –
对不起,这是一个错误。我从另一个例子中复制了代码,并且在那里留下了@ @组。我编辑了我的问题,所以'@ group'现在是'@ player'。希望澄清它。 – glevine