Только что начал изучать активную запись, и мне интересно, как наилучшим образом извлечь данные из нескольких таблиц, где используется агрегированный запрос SQL.
В следующем примере (из медицинского приложения) я ищу самые последние события различных типов для каждого пациента (например, последний визит, последний лабораторный тест и т. Д.). Как вы можете видеть из запроса sql ниже, я ищу значение max (date) из сгруппированного запроса. Для этого я прибег к find_by_sql - однако я хотел бы увидеть, как это сделать без использования find_by_sql.
IOW - как бы вы получили здесь необходимые данные, используя чистый подход ActiveRecord. Ниже приведены определения таблиц и классов, с которыми я тестирую:
Поиск по Sql для получения самых последних записей для каждого типа - обратите внимание на 'max (event_date)' здесь
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"
Вот пример результата запроса sql:
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
Классы
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