2

我的问题的标题基本上说明了一切,但我想知道是否有人可以帮助我找到一组特定用户 ID 之间存在的对话。基本上,如果有人试图开始与特定用户组的对话,如果与该组用户的对话已经存在,我希望我的应用程序加载该对话而不是创建另一个对话。执行此操作的正确查询是什么?我尝试查看对话类:http ://rubydoc.info/gems/mailboxer/Conversation 。当我跑

Conversation.first.participants

我可以看到对话中的参与者,但没有看到任何查询仅包含特定 ID 集的对话的方法。

我想要做的基本上是这样的:

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

这将匹配与具有 ID 的参与者的[current_user.id, 3, 5]对话,但不匹配与具有 ID 的参与者的[current_user.id, 3]对话或与具有 ID 的参与者的对话[current_user.id, 3, 5, 7]

4

2 回答 2

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 回答
1

参考 Mailboxer Coversation Docsql 查找具有相同关系的记录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 回答