Одна и та же модель для двух ассоциаций - PullRequest
37 голосов
/ 14 марта 2011

У меня есть модель PointOfContact, которая has_many Systems. Со стороны Systems я хочу идентифицировать PointOfContact как technical_manager или project_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 не знает о своей связи с Системой. Почему это?

@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 ]

65 голосов
/ 18 марта 2011

Благодаря jamesw на RailsForum.com: Одна и та же модель для двух ассоциаций принадлежащих_ решение найдено.

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
0 голосов
/ 06 марта 2019

Из документации 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
...