我有以下四种型号

 class User < ActiveRecord::Base
   has_many :conversation_memberships
   has_many :conversations, :through => :conversation_memberships
   has_many :messages, :through => :conversations
 end

 class Conversation < ActiveRecord::Base
   has_many :messages
   has_many :members, :class_name => 'ConversationMembership', :foreign_key => :conversation_id
   has_many :users, :through => :members
 end

 class ConversationMembership < ActiveRecord::Base
   belongs_to :user
   belongs_to :conversation
 end

 class Message < ActiveRecord::Base
   belongs_to :conversation
   belongs_to :user
 end

因此Conversation可以有许多usersConversationMembership。理想情况下,每个会话的用户集都是唯一的,因此用户之间只能有一个会话。
通过这个设置,我可以使用以下Rails方法查询a1,2,3的成员id:
Conversation.find(1).user_ids # => [1,2,3]

这将提供用户Conversation12之间对话中的用户ID。
我要做的是与此截然相反的事情,所以试着在3个用户和只有那些用户之间找到一个对话。在伪代码形式中,类似于3
此语法具有所需的效果,但使用3个(或更多)查询:
User.find(1).conversations & User.find(2).conversations & User.find(3).conversations

我希望通过一个查询(可能使用子查询)来实现这一点,但在我的一生中,我不知道如何让这个工作。自从我上一次不得不像这样编写复杂的原始SQL以来,已经快6年了,所以我的大脑充满了蛛网。
总结一下:
我希望能够查询Conversation.find_by(:user_ids => [1,2,3])模型并返回2个或多个用户之间的现有会话。
如果所有这些都失败了,我能想到的最接近的工作就是将Conversation的内容存储在conversation.user_ids模型的Array列中。

最佳答案

您需要加入用户表:

Conversation.joins(:users).where('users.id' => [1, 2, 3])

关于ruby-on-rails - 使用关联外键通过关联查找记录,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28686984/

10-12 01:48