查找特定用户ID集之间的对话 - 邮箱路由器

时间:2014-03-12 02:29:21

标签: ruby-on-rails mailboxer

我的问题标题基本上都说明了,但我想知道是否有人可以帮助我找到特定用户ID之间存在的对话。基本上,如果有人试图与某组用户开始对话,如果已经存在与该组用户的对话,我希望我的应用加载该对话而不是创建另一个对话。这样做的正确查询是什么?我试着查看Conversation类: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]

2 个答案:

答案 0 :(得分:1)

引用Mailboxer Coversation Docsql Finding records that have the same relationships以及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对结果进行分组,并过滤​​不为每个参与者重复的结果,这意味着它只返回与所有参与者有关系的结果。

答案 1 :(得分: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