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

これは通常、having 句を使用して実現されます。Squeel では、次のようなことができます (注、テストされていません)。

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

会話 ID でグループ化し、各グループの最大メッセージ ID を持つ行以外のすべての行を除外する必要があります。

注: 多くの場合、「持つ」ことは特に望ましいことではありません。クエリの説明をチェックして、後で過度の苦痛を引き起こさないようにする必要があります。その場合は、会話の最後のメッセージを指すキャッシュ列を会話に追加し、その列に対して関連付けを設定することを検討してください。

于 2012-09-12T12:33:38.473 に答える