2

私の質問のタイトルは基本的にすべてを示していますが、特定のユーザー ID のセットの間に存在する会話を見つけるのを誰かが手伝ってくれるかどうか疑問に思っていました。基本的に、誰かが特定のユーザーのセットとの会話を開始しようとした場合、その正確なユーザーのセットとの会話が既に存在する場合、別の会話を作成するのではなく、その会話をアプリに読み込みます。これを行うための適切なクエリは何ですか? Conversation クラスを見てみました: http://rubydoc.info/gems/mailboxer/Conversation。私が走るとき

Conversation.first.participants

会話の参加者を確認できますが、特定の ID セットのみを含む会話を照会する方法がわかりませんでした。

私ができるようにしたいのは、基本的に次のようなものです:

find Conversation where participants are exactly [current_user.id, 3, 5]

これは、ID を持つ参加者との会話には一致しますが、ID を持つ参加者との会話や[current_user.id, 3, 5]ID を持つ参加者との会話には一致しません。[current_user.id, 3][current_user.id, 3, 5, 7]

4

2 に答える 2

1

Mailboxer Coversation Docとsqlを参照した後 、同じ関係を持つレコードrails query docを見つける

私はこれがうまくいくと思う

participants_id = [current_user.id, 3, 5]
select('DISTINCT mailboxer_conversations.*').
  where('mailboxer_notifications.type'=> Mailboxer::Message.name).
  order("mailboxer_conversations.updated_at DESC").
  joins(:receipts).where('mailboxer_receipts.receiver_id IN (#{participants_id.join(",")}) AND mailboxer_receipts.receiver_type => #{current_user.class.base_class.to_s})')').group('mailboxer_conversations.id').having('count(1) = #{participants_id.length}')

クエリの最初の部分

participants_id = [current_user.id, 3, 5]
select('DISTINCT mailboxer_conversations.*').
  where('mailboxer_notifications.type'=> Mailboxer::Message.name).
  order("mailboxer_conversations.updated_at DESC").
  joins(:receipts).where('mailboxer_receipts.receiver_id IN (#{participants_id.join(",")} AND mailboxer_receipts.receiver_type => #{current_user.class.base_class.to_s})')

ユーザーが参加者かどうかを取得するために MailBoxer によって使用されます

第二部

.group('mailboxer_conversations.id').having('count(1) = #{participants_id.length}')

は、会話 ID によって結果をグループ化するために使用され、参加者ごとに繰り返されない結果をフィルター処理します。つまり、すべての参加者と関係があるもののみが返されます。

于 2014-03-12T23:21:31.147 に答える
1

u1 と u2 がメッセージ可能オブジェクトであると仮定します。

existing_conversation = Conversation.participant(u1).where('conversations.id in (?)', Conversation.participant(u2).collect(&:id))

https://github.com/mailboxer/mailboxer/issues/95#issuecomment-22741452

于 2015-04-06T21:15:36.617 に答える