2015-07-22 8 views
7

(Siehe unten für Link-Projekt zur Probe)Wie zusammen mehrere Modelle unter einem Namen zu einer Gruppe in Single Table Inheritance Klassen

Was habe ich ARBEITEN:

ich viele Benutzer-Typen, die ich Handhabung bin mit Einzel Table Inheritance in Rails, zB:

class User < ActiveRecord::Base 
    self.inheritance_column = :meta_type 
    scope :doctors, -> { where(meta_type: 'Doctor') } 
    scope :patients, -> { where(meta_type: 'Patient') } 
    scope :nurses, -> { where(meta_type: 'Nurse') } 
    scope :employees, -> { where(meta_type: 'Employee') } 

end 

class Doctor < User 
    has_many :doctor_patient_relations 
    has_many :patients, :through => :doctor_patient_relations 
    has_many :doctor_nurse_relations 
    has_many :nurses, :through => :doctor_nurse_relations 
    ... 
    # More join tables between each type of user 
end 

class Patient < User 
    has_many :doctor_patient_relations 
    has_many :doctors, :through => :doctor_patient_relations 
    has_many :nurse_patient_relations 
    has_many :nurses, :through => :nurse_patient_relations 
    has_many :employee_patient_relations 
    has_many :employees, :through => :employee_patient_relations 
end 

insgesamt ich habe 4 User Typen: Doctor, Nurse, Employee und Patient.

Was möchte ich in der Lage sein, ist der Ärzte alle eines Patienten zu tun bekommen, Krankenschwestern und Mitarbeiter mit einem Aufruf wie folgt aus:

@this_patient.providers # => [doctor1, nurse2, employee3] 

Um dies zu erreichen, dachte ich über die drei verschiedenen Arten zu entfernen von Join-Tabellen zwischen einem Patienten und einem Provider (z. B. doctor_patient_relations) und ersetzen sie alle durch eine einzige Tabelle namens provider_patient_relations.

NEUE DATEI Ich habe eventuell helfen diese Funktion zu erhalten:

class ProviderPatientRelation < ActiveRecord::Base 
    belongs_to :provider, class_name: "User", :foreign_key => :provider_id 
    belongs_to :patient, class_name: "User", :foreign_key => :patient_id 
end 

und ich auch diese in der User.rb Datei hinzugefügt:

class User < ActiveRecord::Base 
    ... 
    has_many :provider_patient_relations 
    has_many :patients, -> { where meta_type: 'Doctor' || 'Nurse' }, :through => :provider_patient_relations, :inverse_of => :patient 
    has_many :providers, -> { where meta_type: 'Patient' }, :through => :provider_patient_relations, :inverse_of => :provider 
end 

Das Problem ist, da ich nicht tun haben einen Klassennamen Provider, Schienen wirft einen Fehler:

NoMethodError: undefined method `_reflect_on_association' for Provider:Class 

Wie kann ich Schienen sagen in Ärzte zu sehen, Krankenschwestern und Mitarbeiter, wenn Ich rufe @this_patient.providers an?

EDIT

ich ein Beispielprojekt in der Readme-Anweisungen zum Laufen zu bringen haben, Check-out und es bis zu werden:

https://github.com/waleedasif322/group-user-types-example-rails

Antwort

2

Sie waren ganz in der Nähe. In Ihrem Patientenmodell haben Sie "wie" verwendet, als ob Sie es als Alias ​​zuordnen wollten. Allerdings wird "as" für polymorphe Assoziationen verwendet ... Ich habe Ihr Patientenmodell durch Folgendes ersetzt und konnte erfolgreich Patient.first.providers in einer Konsole aufrufen.

class Patient < User 
    has_many :patient_provider_relations 
    has_many :providers, through: :patient_provider_relations, source_type: "User" 
end 

Ich zog dann die Relation Patient Provider Verbände ein Anliegen:

module Patientable 
    extend ActiveSupport::Concern 

    included do 

     belongs_to :provider, polymorphic: true 
     has_many :patient_provider_relations, as: :provider 
     has_many :patients, through: :patient_provider_relations, source: :patient 

    end 
end 

Und fügte hinzu schließlich include Patientable in Ihrem Arzt, Krankenschwester, und Mitarbeiter-Modelle.

+0

es ist schön: ') – achabacha322