O Active Record do Rails pode lidar com consultas agregadas SQL?
Apenas comecei a aprender o registro ativo e estou querendo saber como recuperar dados de várias tabelas onde uma consulta agregada SQL está envolvida.
No exemplo a seguir (de um aplicativo médico), estou procurando os eventos mais recentes de vários tipos para cada paciente (por exemplo, última visita, último teste de laboratório, etc.). Como você pode ver na consulta sql abaixo, estou procurando o valor max (data) de uma consulta agrupada. Eu recorri a find_by_sql para fazer isso - no entanto eu gostaria de ver como fazer isso sem usar o find_by_sql.
IOW - como você obteria os dados necessários aqui usando uma abordagem pura de ActiveRecord? Abaixo estão os defs de Tabela e Classe com os quais estou testando:
Encontre pelo Sql para recuperar as entradas mais recentes para cada tipo - observe o 'max (event_date)' aqui
strsql = "select p.lname, e.patient_id, e.event_type, max(e.event_date) as event_date
from events e
inner join patients p on e.patient_id = p.id
group by p.lname, e.patient_id, e.event_type"
Aqui está o resultado da consulta sql de amostra:
lname, patient_id, event_type, latest 'Hunt', 3, 'Labtest', '2003-05-01 00:00:00' 'Hunt', 3, 'Visit', '2003-03-01 00:00:00' 'Seifer', 2, 'Labtest', '2002-05-01 00:00:00' 'Seifer', 2, 'Visit', '2002-03-01 00:00:00' Table Relationships are: Tables ---> Patients --> Events --> visits --> labtests --> ... other patients t.string :lname t.date :dob events t.column :patient_id, :integer t.column :event_date, :datetime t.column :event_type, :string visits t.column :event_id, :integer t.column :visittype, :string labtests t.column :event_id, :integer t.column :testtype, :string t.column :testvalue, :string
Classes
class Patient < ActiveRecord::Base
has_many :events
has_many :visits, :through =>:events
has_many :labtests, :through => :events
end
class Event < ActiveRecord::Base
has_many :visits
has_many :labtests
belongs_to :patient
end
class Visit < ActiveRecord::Base
belongs_to :event
end
class Labtest < ActiveRecord::Base
belongs_to :event
end