ActiveRecord 按 2 列分组
ActiveRecord Group by 2 columns
Message
型号
user_id # owner of the message
sender_id # user that sent message
receiver_id # user then recieved message
content # content of message
我有Messages
。我想按 sender_id
和 receiver_id
对它们进行分组,因为它们是 "conversation thread".
当我分组时,我得到的结果看起来像
[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] 是同一个 'group' 的一部分。我怎样才能做到这一点?
您可以使用 LEAST()
和 GREATEST()
对 sender_id
和 recipient_id
进行排序(至少在 Postgres 和 MySQL 中)。
这是 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
使用@Kristján 提供的技巧,您可以在 ruby 中合并 [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
Message
型号
user_id # owner of the message
sender_id # user that sent message
receiver_id # user then recieved message
content # content of message
我有Messages
。我想按 sender_id
和 receiver_id
对它们进行分组,因为它们是 "conversation thread".
当我分组时,我得到的结果看起来像
[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] 是同一个 'group' 的一部分。我怎样才能做到这一点?
您可以使用 LEAST()
和 GREATEST()
对 sender_id
和 recipient_id
进行排序(至少在 Postgres 和 MySQL 中)。
这是 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
使用@Kristján 提供的技巧,您可以在 ruby 中合并 [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