ruby-on-rails - 使用关联外键通过关联查找记录

标签 ruby-on-rails postgresql activerecord arel

我有以下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 拥有许多用户。理想情况下,每个对话的用户组都是唯一的,因此用户 1,2,3 之间只能进行一次对话。

完成此设置后,我可以使用以下 Rails 方法查询Conversation 的成员 ID:

Conversation.find(1).user_ids # => [1,2,3] 

这为我提供了用户 123 之间对话中的用户 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 列中对话模型。

最佳答案

您需要加入用户表:

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

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

相关文章:

ruby-on-rails - 哪个记录导致 NOTICE : word is too long to be indexed

ruby-on-rails - Rails ActiveRecord 回调

ruby-on-rails - PostgreSQL、Rails 和 :order => problem

ruby-on-rails - Controller 最佳实践

ruby-on-rails - rails : problem with form

java - 从 Java 运行 Ruby 脚本

postgresql - 如何获取 OSM 文件以生成街道宽度?

ruby-on-rails - 使用 Postgres 在 ActiveRecord 查询中别名计算结果、分组和求和

ruby-on-rails-3 - validates_inclusion_of Rails 3 查询未按预期工作

ruby-on-rails - AWS S3 文件上传返回 403 :Forbidden with Carrierwave/fog gems in Rails