그래서이 흥미로운 주제를 확인하고 내가 아는 것을 말할 것입니다.
당신은 has_many :through
에서 평소와 같이 객체를 생성 할 때 :
class Contact
has_many :contactables
has_many :managers, :through => :contactables
end
class Manager
has_many :contactables
has_many :contacts, :through => :contactables
end
class Client
has_many :contactables
has_many :contacts, :through => :contactables
end
class Contactable
belongs_to :contact
belongs_to :manager
belongs_to :client
end
당신은 각 참조 된 개체 이리저리 외래 키를 사용하여 얻을. 다형성은 훌륭한 솔루션처럼 보입니다. 그래서 :
class Contactable
belongs_to :contact
belongs_to :polymorphic_model, polymorphic: true
end
class Contact
has_many :contactables
has_many :managers, :through => :contactables, :source => :polymorphic_model, :source_type => 'Manager'
end
class Manager
has_many :contactables, :as => :polymorphic_model
has_many :contacts, :through => :contactables
end
는 설정 : 옵션이
:source => :polymorphic_model
는 서브 클래스에서 관련 개체를 가져 레일을 얘기하는 데 사용되는 다형성 연결을 나타냅니다한다. :source
은 :class_name
과 같습니다. 이 옵션을 사용하지 않으면 Rails는 Contactable 테이블에서 연결된 Manager를 가져 오려고 시도하지만 가상 Polymorphic_model을 통해 도달해야합니다.
Contactable에 belongs_to :polymorphic_model
을 추가하면 belongs_to :contact
으로 인해 Contact (마녀가 이미 존재하기 때문에)가 Manager 또는 클라이언트와 연결될 수 있습니다. 이는 다형성 연관이 수행하는 것이기 때문에 - 둘 이상의 상위 테이블을 참조하기 때문입니다. Contact have_many
Contactables 때문에 동일한 Contact 객체를 여러 관리자 또는 클라이언트와 연결할 수 있습니다. 그래서 당신이 그것을 이해하고 나면, 그것은 매우 단순 해 보입니다. - 조인 된 모델은 Contact에 속하며 조인 된 모델은 다형성 연관을 통해 Manager 및 클라이언트에 대한 참조를 보유합니다. 따라서 연락처에 많은 관리자가 있으려면 동일한 Contact에 속하지만 다른 Manager에 속한 다른 Contactable 객체를 만듭니다. 슈퍼 효율적인 보이지 않지만, 개인적으로, 더 나은 방법을 모르고 ..새로운 접촉
이제
Manager.create!(name: "Bravo")
=> #<Manager id: 1, created_at: "2017-04-12 12:17:41", updated_at: "2017-04-12 12:17:41", name: "Bravo">
Manager.create!(name: "Johnny")
=> #<Manager id: 2, created_at: "2017-04-12 12:18:24", updated_at: "2017-04-12 12:18:24", name: "Johnny">
Contact.create!(number:"123")
=> #<Contact id: 1, created_at: "2017-04-12 12:18:59", updated_at: "2017-04-12 12:18:59", number: 123>
c = Contactable.new
c.contact = Contact.first
c.unit = Manager.first
c
=> #<Contactable id: nil, unit_type: "Manager", created_at: nil, updated_at: nil, unit_id: 1, contact_id: 1>
같은 접촉에 다른 관리자를 설정하기 위해, 우리는 생성 : 여기
는 테스트 증거입니다
cc = Contactable.new
cc.contact = Contact.first
cc.unit = Manager.last
cc
=> #<Contactable id: nil, unit_type: "Manager", created_at: nil, updated_at: nil, unit_id: 4, contact_id: 1>
그리고 얻을 수있는 모든 관련 :
Contact.first.managers
연락 가능한 데이터베이스 :
contact_id
unit_id
unit_type
그리고 @ 빌 Karwin 하나 흥미로운 인용 :
다형성 협회 디자인은 관계형 데이터베이스 설계의 규칙을 나누기. 나는 그것을 사용하지 않는 것이 좋습니다.
하지만 그는 오래 전이 편지를 썼습니다. 아마도 지금은 관련성이 없습니다.
Why can you not have a foreign key in a polymorphic association?
나는 우리가이'Contact' 모델'에서'source' 옵션과 함께뿐만 아니라 source_type' 필요가 있다고 생각합니다. 즉 :'source_type => 'Manager'' – Arif
예, 이전에 추가하지 않았습니다. 다소 선택 사항 이었기 때문에 - 삶을 편하게하기 위해서입니다. 이제 그것을 포함 시켰습니다. –