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

Antworten auf die Frage(3)

Ihre Antwort auf die Frage