两个belongs_to关联使用相同的模型

43

我有一个模型 PointOfContact,它拥有多个 Systems。从 Systems 的角度来看,我想将 PointOfContact 标识为 technical_managerproject_manager(或两者兼备)。同时仍然只在数据库中保存 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不知道它与System的关联。为什么会这样?

@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
2个回答

76

感谢RailsForum.com的jamesw:同一模型用于两个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中的:through关联关系的细节,请参见以下链接:[http://railscasts.com/episodes/163-self-referential-association?view=asciicast] - Zippie

2
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接