Sha256: c82d417c5eba8b84bdcc1b09596be28ed2269d49173f7fe42d269bc565c008a1
Contents?: true
Size: 1.66 KB
Versions: 5
Compression:
Stored size: 1.66 KB
Contents
# frozen_string_literal: true require_dependency "renalware/pathology" require "sql/indexed_case_stmt" module Renalware module Pathology class ObservationDescriptionsByCodeQuery def initialize(codes:, relation: ObservationDescription) @relation = relation @codes = Array(codes) end # Executes SQL that looks like this: # SELECT "pathology_observation_descriptions".* FROM "pathology_observation_descriptions" # WHERE "pathology_observation_descriptions"."code" IN ('HGB', 'MCV', 'MCH',... # ORDER BY CASE code # WHEN 'HGB' THEN 0 # WHEN 'MCV' THEN 1 # WHEN 'MCH' THEN 2 # ... # END # and returns results that look like this: # [ # #<Renalware::Pathology::ObservationDescription id: 767, code: "HGB", name: "HGB">, # #<Renalware::Pathology::ObservationDescription id: 1058, code: "MCV", name: "MCV">, # #<Renalware::Pathology::ObservationDescription id: 1055, code: "MCH", name: "MCH">, # ... # ] def call stmt = SQL::IndexedCaseStmt.new(:code, @codes) # Generate a CASE statement for ordering records = @relation.where(code: @codes).order(stmt.generate) verify_all_records_found(records) records end private def verify_all_records_found(records) found_codes = records.map(&:code) # TODO: Bug? Shouldn't this be @codes - found_codes? missing_records = found_codes - @codes if missing_records.present? raise ActiveRecord::RecordNotFound, "Missing records for #{missing_records}" end end end end end
Version data entries
5 entries across 5 versions & 1 rubygems