2013-12-17 29 views
0

Simple table layout如何紅寶石範圍複雜查詢

我的模型看起來像

class Message < ActiveRecord::Base 
    belongs_to :meeting 
end 

class Meeting < ActiveRecord::Base 
    has_many :messages 
end 

數據可能看起來像

會議
1,會議A,2012-12- 10 08:00
2,會議B,2012-12-08 07:00

消息
32.2,好,2012年11月20日08:00
33.1,太可怕了,2012年11月18日07:00
34,2,壞,2012-09- 23 08:00
35,1,很好,2012-08-18 07:00
36,2,恐怖,2012-05-20 08:00
37,1,SoSo,2012-04-18 07 :00

我想消息的集合,其中僅最大(created_at),組(MEETING_ID)返回....
所以用我的樣本數據作爲例子將返回一個爛攤子只有2行
32.2,良好的年齡收集,二零一二年十一月二十零日08:00
33.1,太可怕了,2012年11月18日07:00

回答

0

一個範圍在Meeting模型中定義爲最最新的消息是:

# app/models/meeting.rb 
scope :most_recent, lambda { joins(:messages).order('messages.created_at desc') } 

在你的問題再往下,你提到要使用Message.most_recent.joins(:meeting)然後爲此你會在你的Message模型添加以下範圍:

# app/models/message.rb 
scope :most_recent, lambda { order('created_at desc') } 

更新:

嘗試下面的查詢選擇messages與最新created_at分組由meeting_id。這應該給你你期待什麼:

latest_by_meetings = Message.select('max(id) as max_id, max(created_at) as max_created_at').group(:meeting_id) 
Message.where(id: latest_by_meetings.collect(&:max_id).order('created_at desc') 

所以,你的範圍可能是這樣的:

# app/models/message.rb 
scope :most_recent, lambda { where(id: select('max(id) as max_message_id').group(:meeting_id).collect(&:max_message_id)).order('created_at desc') } 
+0

感謝您抽出時間來回答我的問題,但我想我可能已經做了壞解釋我自己的工作...... 無論我做出的activerecord電話是否需要返回所有會議,並且僅爲每個會議記錄返回最新消息 我有道理嗎? – bopritchard

+0

@bopritchard,這可能是我誤解的部分。你不是說你需要'Meeting.first.messages.order('messages.created_at desc')'? – vee

+0

對於混淆感到抱歉...我可能使它變得比它需要的更加複雜...這個怎麼樣?... 只有max(created_at)組(meeting_id)被返回的消息集合... 所以使用我的樣本數據將返回一個消息集合 [32,2,好,2012-11-20 08:00] [33,1,恐怖,2012-11-18 07:00] 謝謝你再次 – bopritchard