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 の create アクションを使用して、結合モデル属性なしで関連付けレコードを作成することに成功しました。
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
次のようなパラメーターを使用して、2 つのチームを持つ新しいプレーヤーを作成した後:
{"player"=>{"name"=>"George Baker", "teams"=>[{"city"=>"Buffalo"}, {"city"=>"Detroit"}]}}
データベースは次のようになります。
プレーヤー
id: 1、名前: ジョージ・ベイカー
チーム
id: 1、都市: バッファロー
id: 2、都市: シアトル
所属
ID: 1、player_id: 1、team_id: 1、年: null
ID: 2、player_id: 1、team_id: 2、年: 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
ここで、次のようなパラメータを使用して 2 つのチームを持つ新しいプレーヤーを作成する場合:
{"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、年: null
ID: 2、player_id: 1、team_id: 2、年: null
ID: 3、player_id: 2、team_id: 1、年: null
id: 4、player_id: null、team_id: 3、年: 1999
ID: 5、player_id: 2、team_id: 3、年: null
そのため、2 つのレコードだけが作成されるはずだったのに、3 つのレコードが作成されました。所属レコードID:3は正しいです。id: 4 の場合、player_id がありません。id: 5 の場合、年がありません。
明らかにこれは正しくありません。どこが間違っていますか?
ありがとう