Short version and then the details:
In my application users are of two roles, staff and clinician. Staff users create patient records. Sometimes a staff user would create a patient record for their own patient, and sometimes a staff user would create a patient record for a patient who has another staff user as their doctor. My intention is to include in each patient record both the staff user who created the record as well as the staf user who is that patient's doctor. I am having trouble figuring out the proper active record relationships to make this work.
In my patients table I have user_id to save the id of the staff user who created the patient record. In console when I create a patient and do Patient.last.user, it returns the user who created the record.
In my patients table I also have doctor_id to save the id of the staff user who is that patient's doctor. In console when I create a patient and do Patient.last.doctor I get this error:
ActiveRecord::HasManyThroughAssociationNotFoundError: Could not find the association :users in model Patient
I am successfully saving the doctor_id, but I can't seem to retrieve the doctor name the way I want to. Am I dong something incorrectly, or is this not possible given the pattern I'm using?
Details:
class User < ApplicationRecord
include Clearance::User
include StaffUser
include ClinicianUser
validates :first_name, :last_name, :role, presence: true
enum role: { staff: 0, clinician: 1 }
I have staff concerns and clinician concerns that live under app/model/concerns:
clinician_user.rb
require 'active_support/concern'
module ClinicianUser
extend ActiveSupport::Concern
included do
has_one :clinician_profile
has_many :lists
has_many :universities, through: :lists
after_create :create_clinician_profile
end
class_methods do
end
end
staff_user.rb
module StaffUser
extend ActiveSupport::Concern
included do
belongs_to :university
has_many :patients
has_many :referral_requests
validates :university_id, presence: true
end
class_methods do
end
end
Here is the patient model:
class Patient < ApplicationRecord
belongs_to :user, -> { where role: :staff }
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
has_one :doctor, through: :users
end
Doctor doesn't exist as a model - must it for this to work? Is there any way for it to just reference users again?
See Question&Answers more detail:
os