Рассматривая приведенный ниже код, в двух словах, мне нужно отслеживать, почему пациенты зарегистрированы и исключены из программы, и с этим также иметь возможность определить, какие программы в настоящее время зарегистрированы (может быть несколько).
class Program < ApplicationRecord
end
class EnrollmentStatusChange < ApplicationRecord
belongs_to :patient
belongs_to :program
enum enrollment_status: %w[Initial Enrolled Disenrolled]
validates :reason, present: true # Why the status changed?
scope :ongoing_enrollment, lambda {
where(id: pluck(:program_id).uniq.flat_map do |program_id|
last_disenrolled_at = disenrolled.where(program_id: program_id).maximum(:created_at) || Date.new
enrolled.where(program_id: program_id)
.where('created_at > ?', last_disenrolled_at)
.pluck(:id)
end)
}
end
class Patient < ApplicationRecord
has_many :enrollment_status_changes, dependent: :destroy
has_many :current_enrollment_statuses, -> { ongoing_enrollment }, class_name: 'EnrollmentStatusChange'
has_many :programs, through: :current_enrollment_statuses
end
Это работает, но мне кажется, что я слишком стараюсь достичь этого бита:
scope :ongoing_enrollment, lambda {
where(id: pluck(:program_id).uniq.flat_map do |program_id|
last_disenrolled_at = disenrolled.where(program_id: program_id).maximum(:created_at) || Date.new
enrolled.where(program_id: program_id)
.where('created_at > ?', last_disenrolled_at)
.pluck(:id)
end)
}
Мне в основном нужен более простой способ масштабирования этого подзапроса без необходимости извлекать идентификаторы для programs
.