Hi,
Just started learning active record and am wondering how to best
retrieve data from multiple tables where an SQL aggregate query is
involved.
In the following example (from a medical app) I’m looking for the most
recent events of various types for each patient (e.g. last visit, last
labtest etc). As you can see from the sql query below I’m looking for
the max(date) value from a grouped query. I resorted to find_by_sql to
do this - however I’d like to learn how to do this type of query
without using find_by_sql.
IOW - how would you get the required data here using a pure
ActiveRecord approach. Below are the Table and Class defs I’m testing
with:
Find by Sql to retrieve most recent entries for each type - note the
‘max(event_date)’ here
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”
Here’s the sample sql query result:
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