0

我一直在考虑gmail如何查询他们的对话。我知道他们使用不同的技术,但我想尽可能地模仿。

目前我获取对话列表,然后我必须为每个对话获取消息。我可以使用普通连接:

Conversation.joins(:messages).first

但这将加入每条消息,我只需要最后一条消息。我将如何构建这个查询?当我做 Conversation.all 时加入会更好:

Conversation.joins(:messages).all # but only join last message for each conversation

另外,我可以使用条件来加入具有特定用户 ID 的最后一条消息吗?

message.user_id = 1
Conversation.joins(:messages).all # only last message where user_id = 1

如果这有助于演示查询,我正在使用 squeel。

获取对话以及每个对话的最后一条消息的最佳方式是什么?

4

1 回答 1

2

这通常使用have子句来完成。你可能会在 Squeel 中做这样的事情(注意,未经测试):

user.conversations.includes{messages}.group{id}.having{messages.id == max(messages.id)}

您将根据对话 ID 进行分组,然后使用必须清除所有行,但每个组中具有最大消息 ID 的行除外。

注意:在许多情况下,“拥有”并不是一件特别理想的事情。您需要检查查询的解释,以确保您不会在路上给自己造成不必要的痛苦。如果是这样,您可以考虑在对话中添加一个缓存列,指向对话中的最后一条消息,然后只针对该列设置关联。

于 2012-09-12T12:33:38.473 回答