Skip to content

Commit 0c9e319

Browse files
committed
Replace Gillick assessment patient session foreign key
This replaces the foreign key association between Gillick assessments and patient sessions to instead link directly to the patient and the session (via the date). This is needed as we eventually want to replace the `PatientSession` model and to do that we need to make sure all foreign keys to it have been replaced. The functionality should be the same before and after, actually slightly improved as Gillick assessment is only supposed to exist on the day it happened, so now we link directly to the session date rather than the overall session. Jira-Issue: MAV-1818
1 parent 44fe64b commit 0c9e319

21 files changed

+149
-57
lines changed

app/controllers/api/testing/teams_controller.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ def destroy
2828
patient_ids = team.patients.pluck(:id)
2929

3030
patient_sessions = PatientSession.where(session: sessions)
31-
log_destroy(GillickAssessment.where(patient_session: patient_sessions))
3231
log_destroy(PreScreening.where(patient_session: patient_sessions))
3332
patient_sessions.in_batches { log_destroy(it) }
3433

@@ -37,6 +36,7 @@ def destroy
3736
log_destroy(AccessLogEntry.where(patient_id: patient_ids))
3837
log_destroy(ArchiveReason.where(patient_id: patient_ids))
3938
log_destroy(ConsentNotification.where(patient_id: patient_ids))
39+
log_destroy(GillickAssessment.where(patient_id: patient_ids))
4040
log_destroy(Note.where(patient_id: patient_ids))
4141
# In local dev we can end up with NotifyLogEntries without a patient
4242
log_destroy(NotifyLogEntry.where(patient_id: nil))

app/controllers/patient_sessions/gillick_assessments_controller.rb

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# frozen_string_literal: true
22

33
class PatientSessions::GillickAssessmentsController < PatientSessions::BaseController
4+
before_action :set_session_date
45
before_action :set_gillick_assessment
56

67
def edit
@@ -20,12 +21,19 @@ def update
2021

2122
private
2223

24+
def set_session_date
25+
@session_date = @session.session_dates.find_by!(value: Date.current)
26+
end
27+
2328
def set_gillick_assessment
2429
@gillick_assessment =
25-
@patient_session
30+
@patient
2631
.gillick_assessments
2732
.order(created_at: :desc)
28-
.find_or_initialize_by(programme: @programme)
33+
.find_or_initialize_by(
34+
session_date: @session_date,
35+
programme: @programme
36+
)
2937
end
3038

3139
def gillick_assessment_params

app/lib/patient_merger.rb

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,10 @@ def call
3232
patient_id: patient_to_keep.id
3333
)
3434

35+
patient_to_destroy.gillick_assessments.update_all(
36+
patient_id: patient_to_keep.id
37+
)
38+
3539
patient_to_destroy.school_moves.find_each do |school_move|
3640
if patient_to_keep.school_moves.exists?(
3741
home_educated: school_move.home_educated,
@@ -76,9 +80,6 @@ def call
7680
session_id: patient_session.session_id
7781
)
7882
)
79-
patient_session.gillick_assessments.update_all(
80-
patient_session_id: existing_patient_session.id
81-
)
8283
patient_session.pre_screenings.update_all(
8384
patient_session_id: existing_patient_session.id
8485
)

app/lib/reports/offline_session_exporter.rb

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -167,13 +167,17 @@ def consents
167167
def gillick_assessments
168168
@gillick_assessments ||=
169169
GillickAssessment
170-
.select(
171-
"DISTINCT ON (patient_session_id, programme_id) gillick_assessments.*"
170+
.select("DISTINCT ON (patient_id, programme_id) gillick_assessments.*")
171+
.joins(:session)
172+
.where(
173+
session_dates: {
174+
session:
175+
},
176+
patient_id: patient_sessions.select(:patient_id)
172177
)
173-
.where(patient_session: patient_sessions)
174-
.order(:patient_session_id, :programme_id, created_at: :desc)
178+
.order(:patient_id, :programme_id, created_at: :desc)
175179
.includes(:performed_by)
176-
.group_by(&:patient_session_id)
180+
.group_by(&:patient_id)
177181
.transform_values do
178182
it.group_by(&:programme_id).transform_values(&:first)
179183
end
@@ -244,8 +248,7 @@ def add_patient_cells(row, patient_session:, programme:)
244248
session = patient_session.session
245249

246250
grouped_consents = consents.dig(patient.id, programme.id) || []
247-
gillick_assessment =
248-
gillick_assessments.dig(patient_session.id, programme.id)
251+
gillick_assessment = gillick_assessments.dig(patient.id, programme.id)
249252
triage = triages.dig(patient.id, programme.id)
250253
academic_year = session.academic_year
251254

app/lib/reports/programme_vaccinations_exporter.rb

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -147,22 +147,18 @@ def gillick_assessments
147147
@gillick_assessments ||=
148148
GillickAssessment
149149
.select(
150-
"DISTINCT ON (patient_session_id) gillick_assessments.*, " \
151-
"patient_sessions.patient_id, patient_sessions.session_id"
150+
"DISTINCT ON (patient_id, session_id) gillick_assessments.*, session_id"
152151
)
153-
.joins(:patient_session)
154152
.joins(:session)
155153
.where(
156-
patient_sessions: {
157-
patient_id: vaccination_records.select(:patient_id),
158-
session_id: vaccination_records.select(:session_id)
159-
},
154+
patient_id: vaccination_records.select(:patient_id),
160155
programme:,
161156
session: {
157+
id: vaccination_records.select(:session_id),
162158
academic_year:
163159
}
164160
)
165-
.order(:patient_session_id, created_at: :desc)
161+
.order(:patient_id, :session_id, created_at: :desc)
166162
.includes(:performed_by)
167163
.group_by(&:patient_id)
168164
.transform_values do

app/models/gillick_assessment.rb

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,34 +13,37 @@
1313
# notes :text default(""), not null
1414
# created_at :datetime not null
1515
# updated_at :datetime not null
16-
# patient_session_id :bigint not null
16+
# patient_id :bigint not null
1717
# performed_by_user_id :bigint not null
1818
# programme_id :bigint not null
19+
# session_date_id :bigint not null
1920
#
2021
# Indexes
2122
#
22-
# index_gillick_assessments_on_patient_session_id (patient_session_id)
23+
# index_gillick_assessments_on_patient_id (patient_id)
2324
# index_gillick_assessments_on_performed_by_user_id (performed_by_user_id)
2425
# index_gillick_assessments_on_programme_id (programme_id)
26+
# index_gillick_assessments_on_session_date_id (session_date_id)
2527
#
2628
# Foreign Keys
2729
#
28-
# fk_rails_... (patient_session_id => patient_sessions.id)
30+
# fk_rails_... (patient_id => patients.id)
2931
# fk_rails_... (performed_by_user_id => users.id)
3032
# fk_rails_... (programme_id => programmes.id)
33+
# fk_rails_... (session_date_id => session_dates.id)
3134
#
3235
class GillickAssessment < ApplicationRecord
33-
audited associated_with: :patient_session
36+
audited associated_with: :patient
3437

35-
belongs_to :patient_session
38+
belongs_to :patient
39+
belongs_to :session_date
3640
belongs_to :programme
3741

3842
belongs_to :performed_by,
3943
class_name: "User",
4044
foreign_key: :performed_by_user_id
4145

42-
has_one :patient, through: :patient_session
43-
has_one :session, through: :patient_session
46+
has_one :session, through: :session_date
4447

4548
delegate :academic_year, to: :session
4649

app/models/patient.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ class Patient < ApplicationRecord
7777
has_many :vaccination_records, -> { kept }
7878
has_many :vaccination_statuses
7979

80-
has_many :gillick_assessments, through: :patient_sessions
80+
has_many :gillick_assessments
8181
has_many :parents, through: :parent_relationships
8282
has_many :patient_specific_directions
8383
has_many :pre_screenings, through: :patient_sessions

app/models/patient_session.rb

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@ class PatientSession < ApplicationRecord
4444
belongs_to :patient
4545
belongs_to :session
4646

47-
has_many :gillick_assessments
4847
has_many :pre_screenings
4948
has_many :session_attendances, dependent: :destroy
5049
has_one :registration_status
@@ -54,6 +53,10 @@ class PatientSession < ApplicationRecord
5453
has_one :team, through: :session
5554
has_one :organisation, through: :team
5655

56+
has_many :gillick_assessments,
57+
-> { where(patient_id: it.patient_id) },
58+
through: :session
59+
5760
has_many :notes, -> { where(session_id: it.session_id) }, through: :patient
5861

5962
has_one :latest_note,

app/models/session.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ class Session < ApplicationRecord
5252
has_one :organisation, through: :team
5353
has_one :subteam, through: :location
5454
has_many :programmes, through: :session_programmes
55-
has_many :gillick_assessments, through: :patient_sessions
55+
has_many :gillick_assessments, through: :session_dates
5656
has_many :patients, through: :patient_sessions
5757
has_many :vaccines, through: :programmes
5858

app/models/session_date.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ class SessionDate < ApplicationRecord
2121

2222
belongs_to :session
2323

24+
has_many :gillick_assessments, dependent: :restrict_with_error
2425
has_many :session_attendances, dependent: :restrict_with_error
2526

2627
scope :for_session, -> { where("session_id = sessions.id") }

0 commit comments

Comments
 (0)