我有以下四种型号
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
可以有许多users
到ConversationMembership
。理想情况下,每个会话的用户集都是唯一的,因此用户之间只能有一个会话。通过这个设置,我可以使用以下Rails方法查询a
1,2,3
的成员id:Conversation.find(1).user_ids # => [1,2,3]
这将提供用户
Conversation
、1
和2
之间对话中的用户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/