Kann der Active Record von Rails SQL-Aggregatabfragen verarbeiten?
Ich habe gerade angefangen, aktive Datensätze zu lernen, und frage mich, wie ich am besten Daten aus mehreren Tabellen abrufen kann, an denen eine SQL-Gesamtabfrage beteiligt ist.
Im folgenden Beispiel (aus einer medizinischen App) suche ich für jeden Patienten nach den neuesten Ereignissen verschiedener Art (z. B. letzter Besuch, letzter Labortest usw.). Wie Sie der folgenden SQL-Abfrage entnehmen können, suche ich nach dem Maximalwert (Datum) einer gruppierten Abfrage. Ich habe mich dazu an find_by_sql gewandt - aber ich würde gerne sehen, wie das geht, ohne find_by_sql zu verwenden.
IOW - wie würden Sie die erforderlichen Daten hier mithilfe eines reinen ActiveRecord-Ansatzes erhalten? Unten sind die Tabellen- und Klassendefs aufgeführt, mit denen ich teste:
Suchen Sie nach SQL, um die neuesten Einträge für jeden Typ abzurufen - beachten Sie das 'max (event_date)' hier
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"
Hier ist das Beispiel für ein SQL-Abfrageergebnis:
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
Klassen
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