查找记录,我有以下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
可以通过ConversationMembership
有很多users
。理想情况下,每个对话的用户组是唯一的,因此用户只能在他们之间进行一次对话。
有了这个设置,我可以使用下面的Rails的方法来查询其成员ID的一Conversation
:
Conversation.find(1).user_ids # => [1,2,3]
这给了我用户的ID在会话的用户1
,2
和3
之间。
什么我希望做的是这样做的本质上相反,所以要尽量找到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
的内容存储在Conversation
模型的Array
列中。
我发现有关这个问题的唯一其他相关职位是在这里:http://stackoverflow.com/questions/18889824/rails-find-record-with- all-association-id-matching 但是它并没有真正**解决我的问题,因为它表明与'&'相同的'merge'简写,如果没有一些成员,它不能链接到'n'个成员元编程 – 2015-02-24 02:00:58