【发布时间】:2015-02-24 01:56:21
【问题描述】:
我有以下 4 个模型
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。理想情况下,每个对话的用户集都是唯一的,因此用户1,2,3 在他们之间只能进行一次对话。
通过此设置,我可以使用以下 Rails 方法查询 Conversation 的成员 ID:
Conversation.find(1).user_ids # => [1,2,3]
这为我提供了用户 1、2 和 3 之间对话中的用户 ID。
我想要做的基本上是 相反,因此请尝试查找这 3 个用户和仅这些用户之间的对话。伪代码形式,类似于Conversation.find_by(:user_ids => [1,2,3])。
此语法具有预期的效果,但使用了 3 个(或更多)查询:
User.find(1).conversations & User.find(2).conversations & User.find(3).conversations
我希望通过单个查询(可能使用子查询)来实现这一点,但我一生都无法弄清楚如何让它工作。自从我上次不得不编写像这样复杂的原始 SQL 以来已经快 6 年了,所以我的大脑充满了蜘蛛网。
总结:
我希望能够查询 Conversation 模型并返回 2 个或更多用户之间的现有对话。
如果所有其他方法都失败了,我能想到的最接近的解决方法是将conversation.user_ids 的内容存储在Array 模型上的Array 列中。
【问题讨论】:
-
我发现与此相关的唯一其他相关帖子在这里:stackoverflow.com/questions/18889824/… 但它并没有真正解决我的问题,因为它暗示了相同的@987654338 @ 与
&的简写,不能链接到n没有一些元编程的成员数
标签: ruby-on-rails postgresql activerecord arel