2015-04-22 3 views
2

У меня есть два классаПолучить записи на основе условий на набор связанных записей

class Patient < ActiveRecord::Base 
    belongs_to :camp 
    has_many :vaccinations 
end 

class Vaccination < ActiveRecord::Base 
    belongs_to :patient 
end 

Каждая прививка члены называют vaccine_id. «Полная» вакцинация состоит из набора (скажем) 6 различных вакцин, с :name s = {A, B, C, D, E, F}.

Пациенты получают много прививок, и мне нужен отчет всех пациентов, которые получили «полные» прививки. Есть ли запрос SQL или ActiveRecord, который я могу использовать для получения этого списка пациентов?

ответ

1

Может быть что-то вроде:

# in patient.rb 
scope :with_completed_vaccinations, ->(number) { 
    joins(:vaccinations).group('patients.id'). 
    having('COUNT(vaccinations.name) >= ?', number) 
} 

С этим scope вы можете писать запросы, как:

Patient.with_completed_vaccinations(6) 
0

Это простой способ получить все пациенты, которые получили полное, по крайней мере один полный вакцинация:

Patient.select { |pat| pat.vaccinations.any? { |vac| vac.complete? } } 

И для пациентов, где все прививки полные, просто переключите .any? с .all?

И вы можете обернуть это в рамках, например, поставив этот метод в patient.rb

def self.with_complete_vaccinations 
    select { |pat| pat.vaccinations.any? { |vac| vac.complete? } } 
end 

Все это предполагает, что вы имеете полный? метод, определенный для вашей модели вакцинации.

+0

Это очень неэффективно, потому что он сначала загружает каждого пациента в память, а затем запускает один запрос для каждого пациента по базе данных для загрузки вакцинонов этого пациента ... – spickermann

Смежные вопросы