Aktywny rekord Can Rails obsługuje zapytania agregujące SQL?
Właśnie zacząłem uczyć się aktywnego rekordu i zastanawiam się, jak najlepiej pobierać dane z wielu tabel, w które zaangażowane jest zapytanie agregujące SQL.
W poniższym przykładzie (z aplikacji medycznej) szukam najnowszych wydarzeń różnych typów dla każdego pacjenta (np. Ostatnia wizyta, ostatni test laboratoryjny itp.). Jak widać z poniższego zapytania sql, szukam wartości max (data) z zgrupowanego zapytania. W tym celu skorzystałem z funkcji find_by_sql - jednak chciałbym zobaczyć, jak to zrobić bez używania find_by_sql.
IOW - w jaki sposób można uzyskać wymagane dane przy użyciu czystego podejścia ActiveRecord. Poniżej znajdują się defekty tabeli i klasy, które testuję z:
Znajdź przez Sql, aby pobrać najnowsze wpisy dla każdego typu - zwróć uwagę na „max (event_date)” tutaj
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"
Oto przykładowy wynik zapytania 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
Klasy
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