Как аккуратно определять область подзапросов - PullRequest
0 голосов
/ 06 мая 2020

Рассматривая приведенный ниже код, в двух словах, мне нужно отслеживать, почему пациенты зарегистрированы и исключены из программы, и с этим также иметь возможность определить, какие программы в настоящее время зарегистрированы (может быть несколько).

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.

...