2017-10-12 1 views
0

In meiner Anwendung erstellen Mitarbeiterdaten Patientenakten. Das Patientenmodell hat eine HABTM-Beziehung zu einem Versicherungsmodell, um die Versicherungen zu erfassen, unter denen der Patient versichert ist.Aktive Datensatzabfrage für Subset-Bedingungen

Mitarbeiter Benutzer erstellen Empfehlungsanfragen, die Patienten gehören. Zu den Mitarbeitern gehören auch die Universitäten, die wiederum zu Märkten gehören. Zum Beispiel könnte der Mitarbeiter Jim zur Harvard University gehören, und die Harvard University wiederum gehört zum Markt Boston.

Kliniker Benutzer gehören direkt zu einem Markt.

Kliniker Benutzer haben jeweils ein clinician_profile, und ihre Profile haben eine HABTM Beziehung mit dem Versicherungsmodell, um die Versicherungen zu erfassen/akzeptiert der Kliniker. ClinicianProfile gehört dem Benutzer wo Rolle:: Kliniker.

Die Rollen sind mit einem Enum definiert:

enum role: { staff: 0, clinician: 1, admin: 2 } 

Ein Mitarbeiter Benutzer eine Patientenakte erstellt, die direkt in fließt, einen Verweisungsantrag zu schaffen, die direkt in Versendungen/neue fließt, die ich beabsichtige, eine Liste angezeigt werden von allen Klinikern, die auf ihrem Markt sind und mindestens eine der Versicherungen akzeptieren, für die der Patient versichert ist. Dies ist auf dem Weg, herauszufinden, wie die Überweisungsanfrage und relevante Patientendaten tatsächlich an jeden dieser Kliniker gesendet werden. Ich habe unten gesagt, was ich versuche, mit jedem Schritt zu tun und was nicht funktioniert - jeder Rat, wie man das tut, würde sehr geschätzt werden.

Dispatches-Controller Neue Aktion:

def new 
#This works 
@patient = @referral_request.patient 
#This works 
@user = current_user 

#This works - returns a list of clinician users who match the current user's university's market. 
@market_matched_clinicians = User.clinician.where(market: @user.university.market) 

#This doesn't work -My intention is for this to return a list of clinician profiles that share at least one insurance with the patient. 
@matched_clinician_profiles = ClinicianProfile.where(insurances: [@patient.insurances]) 

#Once I have all of the matched clinician profiles, how can I use that to return the corresponding clinician users? 
# @matched_clinicians = ??? 


@dispatch = @referral_request.dispatches.new 
end 

Modelle:

class User < ApplicationRecord 
    include Clearance::User 
    include StaffUser 
    include ClinicianUser 
    include AdminUser 

module ClinicianUser 
    extend ActiveSupport::Concern 

    included do 
    has_one :clinician_profile 
    has_many :lists 
    has_many :universities, through: :lists 
    has_many :dispatches 
    has_many :referral_requests, through: :dispatches 
    after_create :create_clinician_profile 
    belongs_to :market 
    validates :market_id, presence: true, if: :clinician? 
    end 

class ClinicianProfile < ApplicationRecord 
    belongs_to :user, -> { where role: :clinician } 
    has_and_belongs_to_many :languages 
    has_and_belongs_to_many :races 
    has_and_belongs_to_many :insurances 
    has_and_belongs_to_many :genders 
end 

class Patient < ApplicationRecord 
    belongs_to :author, -> { where role: :staff }, class_name: 'User', foreign_key: 'user_id' 
    has_and_belongs_to_many :genders 
    has_and_belongs_to_many :concerns 
    has_and_belongs_to_many :insurances 
    has_and_belongs_to_many :races 
    has_many :referral_requests 
    belongs_to :staff_doctor, class_name: 'User', foreign_key: 'staff_doctor_id' 

    validates :staff_doctor_id, presence: true 

class ReferralRequest < ApplicationRecord 
    belongs_to :user, -> { where role: :staff } 
    belongs_to :patient 
    has_many :dispatches 
    has_many :clinicians, through: :dispatches 
    has_and_belongs_to_many :languages 
    has_and_belongs_to_many :races 
    has_and_belongs_to_many :genders 
    validates :user_id, presence: true 

    enum status: { created: 0, sent: 1, shared: 2, closed_under_care: 3, closed_not_seeking_care: 4, closed_unresponsive: 5 } 
end 

Dies ist die Ansicht, wo ich diese Ergebnisse zu machen versuchen:

<% provide(:title, "New Dispatch") %> 

<h2> These clinicians match your market and your patient's insurance </h2> 

    <table class="table table-striped"> 
     <thead> 
     <tr> 
      <th>Provider ID</th> 
      <th>Name</th> 
      <th>Provider Market</th> 
      <th>Insurances Accepted</th> 
      <th>Gender/s</th> 
      <th>Race/Ethnicity</th> 
      <th>Languages</th> 

     </tr> 
    </thead> 
    <tbody> 

    <% @users.each do |user| %> 
     <tr> 
     <td><%= user.id %></td> 
     <td><%= user.name %></td> 
     <td><%= user.market.name %></td> 
     <td><%= user.clinician_profile.insurances.map(&:name).to_sentence %></td> 
     <td><%= user.clinician_profile.genders.map(&:name).to_sentence %></td> 
     <td><%= user.clinician_profile.races.map(&:name).to_sentence %></td> 
     <td><%= user.clinician_profile.languages.map(&:name).to_sentence %></td> 
     </tr> 
    <% end %> 
    </tbody> 
    </table> 

Antwort

1

Um ClinicianProfiles zu erhalten, die mindestens eine Versicherung entsprechen:

@profiles = ClinicianProfile.joins(:insurances) 
          .where(insurances: { id: @patient.insurances }) 
          .group('clinician_profiles.id') 
          .having("count(*) = 1") 

Sie können dann holen die Benutzer durch den Beitritt clinician_profiles:

@users = User.joins(:clinician_profile) 
      .where(
       market: @user.university.market, 
       clinician_profile: { id: @profiles } 
      ) 
+0

Danke Max - wenn ich das versuche, bekomme ich einen ActiveRecord Konfigurationsfehler in Dispatches # new. Genauer gesagt heißt es: "Kann 'User' nicht zur Association namens 'clinician_profiles' hinzugefügt werden, vielleicht hast du es falsch geschrieben?". Wenn ich in der Konsole rumstreune, kann ich etwas wie c = User.clinician.first, dann p = c.clinician_profile tun. p.user gibt den Arzt zurück, der das Profil besitzt, aber p.clinician gibt "undefined method 'clinician'" zurück.Ist das das Problem? Muss ich meine Modellassoziationen korrigieren? – mike9182

+0

Ah - sollte 'clinician_profile' im Singular sein. Bearbeitet. – max

+0

Ich entfernte auch den doppelten Markt, den Sie herausgeschnitten haben - im @profiles-Block gibt es einen Rechtschreibfehler des Klinikers in der .group-Zeile, aber nachdem ich diese Dinge geändert habe, erhalte ich den Fehler: SQLite3 :: SQLException: keine solche Spalte: clinician_profile.id – mike9182

0

Tun Sie es in Rails-Art. Ich nehme an, dass Sie eine Verbindung mit ClinicianProfile im Insurance Model definiert haben. Fügen Sie has_many :clinician_profiles, through: insurances zu Patient hinzu und rufen Sie @ patient.clinician_profiles auf.

class Patient < ApplicationRecord 
    belongs_to :author, -> { where role: :staff }, class_name: 'User', foreign_key: 'user_id' 
    has_and_belongs_to_many :genders 
    has_and_belongs_to_many :concerns 
    has_and_belongs_to_many :insurances 
    has_and_belongs_to_many :races 
    has_many :clinician_profiles, through: insurances 
    has_many :referral_requests 
    belongs_to :staff_doctor, class_name: 'User', foreign_key: 'staff_doctor_id' 

    validates :staff_doctor_id, presence: true 
+0

Das beantwortet nicht die Frage. "Mein Ziel ist es, eine Liste von Klinikerprofilen zurückzugeben, die mindestens eine Versicherung mit dem Patienten teilen." – max

+0

Ja das ist genau das, was du meinst. – ninjarails

+0

Nein - er beabsichtigt nicht, Versicherungen als Join-Tabelle zu verwenden. Sie erhalten das Domänenmodell hier nicht. – max

Verwandte Themen