剛剛開始學習活動記錄,想知道如何從涉及SQL聚合查詢的多個表中最好地檢索數據。Can Rails的Active Record處理SQL聚合查詢嗎?
在以下示例中(來自醫療應用程序),我正在爲每個患者尋找各種類型的最近事件(例如上次訪問,上次實驗室等)。正如你可以從下面的sql查詢中看到的,我正在從分組查詢中查找最大值(日期)值。我使用find_by_sql來做到這一點 - 但是我想看看如何在不使用find_by_sql的情況下做到這一點。
IOW - 您將如何使用純ActiveRecord方法獲得所需的數據。
查找SQL來獲取最新的條目爲每種類型 - 請注意,「最大(活動日期)」在這裏
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查詢:下面是表和類DEFS我與測試結果:
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
從OP快速跟進。有一個小調整:連接(vs:join)Ryan的代碼工作並替換了我原始文章中的Find_By_Sql查詢。很酷。然而,我只是注意到(AFAIK)並不是所有的SQL查詢都可以通過ORM調用來實現(例如聯合查詢,它結合了表中的最小值和最大值)。我懷疑這需要通過ORM進行2次單獨的調用,而Find_By_Sql可以在1次調用中完成。 find_by_sql(「從表t中選擇最小值(t.Event_Date)從表t中選擇最大值(t.Event_Date)」) – BrendanC 2009-08-04 04:12:40