¿Puede el registro activo de Rails manejar consultas agregadas de SQL?
Acabo de comenzar a aprender el registro activo y me pregunto cómo recuperar mejor los datos de varias tablas en las que está involucrada una consulta agregada de SQL.
En el siguiente ejemplo (de una aplicación médica) estoy buscando los eventos más recientes de varios tipos para cada paciente (por ejemplo, la última visita, la última prueba de laboratorio, etc.). Como puede ver en la consulta de SQL a continuación, estoy buscando el valor máximo (fecha) de una consulta agrupada. Recurrí a find_by_sql para hacer esto, sin embargo, me gustaría ver cómo hacerlo sin usar find_by_sql.
IOW: ¿cómo obtendría los datos requeridos aquí utilizando un enfoque puro de ActiveRecord? A continuación se muestran las definiciones de tabla y clase que estoy probando con:
Busque por Sql para recuperar las entradas más recientes para cada tipo; anote el 'max (event_date)' aquí
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"
Aquí está el resultado de la consulta SQL de muestra:
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
Las clases
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