モデルPointOfContact
がありますhas_many
Systems
。 Systems
側から、PointOfContact
をtechnical_manager
またはproject_manager
(または両方)。 DBにPointOfContact
1回だけ保持します。
私の試みは次のとおりです。
class System < ActiveRecord::Base
belongs_to :project_manager, :class_name => 'PointOfContact'
belongs_to :technical_manager, :class_name => 'PointOfContact'
end
class PointOfContact < ActiveRecord::Base
has_many :systems
end
仕様を実行すると(例は次のとおりです)、System
の連絡先の関連付けを正しく作成できます。ただし、PointOfContact
はシステムとの関連付けを認識していません。何故ですか?
@sys = System.create
@tm = PointOfContact.create
@pm = PointOfContact.create
@sys.project_manager = @pm
@sys.technical_manager = @tm
@pm.systems.should have(1).items #> expected 1 items, got 0
RailsForum.comのjameswに感謝します: 2つのbelongs_toアソシエーションの同じモデル 解決策が見つかりました。
class System < ActiveRecord::Base
belongs_to :project_manager, :class_name => 'PointOfContact', :foreign_key => 'project_manager_id'
belongs_to :technical_manager, :class_name => 'PointOfContact', :foreign_key => 'technical_manager_id'
end
class PointOfContact < ActiveRecord::Base
has_many :project_managed_systems, :class_name => 'System', :foreign_key => 'project_manager_id'
has_many :technical_managed_systems, :class_name => 'System', :foreign_key => 'technical_manager_id'
end
Railsドキュメントから:
注釈付きの例:
# Employee class with two Employee associations
class Employee < ApplicationRecord
# Employees I manage
has_many :subordinates, class_name: "Employee",
foreign_key: "manager_id"
# Employee that manages me
# NOTE: with :manager reference name, foreign_key defaults to "manager_id",
# hence it is not needed as above. Favor "convention over configuration".
belongs_to :manager, class_name: "Employee"
end