2015-05-23 58 views
1

Message模型的ActiveRecord組由2列

user_id  # owner of the message 
sender_id # user that sent message 
receiver_id # user then recieved message 
content  # content of message 

我有Messages。我想將它們按sender_idreceiver_id分組,因爲它們是「對話線索」。

當我做I組得到的結果看起來像

[1,3] => 5 # user 1 and 3 have 5 messages 
[1,6] => 2 # user 1 and 6 have 2 messages 
[3,1] => 3 # user 3 and 1 have 3 messages 

真的[1,3]和[3,1]是相同的 '組' 的一部分。我怎樣才能做到這一點?

回答

2

您可以通過使用LEAST()GREATEST()(至少在Postgres和MySQL中)對sender_idrecipient_id進行排序來獲得此信息。

這裏有一個fiddle演示SQL:

SELECT 
    LEAST(sender_id, receiver_id), 
    GREATEST(sender_id, receiver_id), 
    count(*) 
FROM messages 
GROUP BY 
    LEAST(sender_id, receiver_id), 
    GREATEST(sender_id, receiver_id) 

而且ActiveRecord相當於:

Message.group('LEAST(sender_id, receiver_id), GREATEST(sender_id, receiver_id)').count 
+0

在我當前的開發環境中不起作用。我使用mysqlite的開發...沒有必要升級到開發中的Postgres ....也許我現在應該....但寧願不現在,因爲我試圖推動功能快速。 – slindsey3000

+0

任何方式與ActiveRecord做到這一點? – slindsey3000

+1

'ActiveRecord'只是你數據庫的一個適配器,所以你需要弄清楚SQLite如何做到這一點。或者,一旦你得到你當前的結果集,將它們合併到Ruby中[像這樣](http://rubyfiddle.com/riddles/92a08)。 –

1

使用@克里斯蒂安提供的訣竅,你可以在紅寶石合併[1,3][1,3]而不是使用SQL功能:

thread_messages_count = Hash.new(0) 
Message.group(:sender_id, :receiver_id).count.each do |k, v| 
    thread_messages_count[k.sort] += v 
end