Sql 如何在单个查询中从ActiveRecord的父级中选择uniq子级?

Sql 如何在单个查询中从ActiveRecord的父级中选择uniq子级?,sql,ruby-on-rails,postgresql,activerecord,Sql,Ruby On Rails,Postgresql,Activerecord,我有一个名为User class User < ActiveRecord::Base has_many: :posts end 如果我有一个作用域posts对象(比如说posts=Post.where(id:[1,2,3,4]) 如何使用活动记录方法查询所有帖子的uniq用户 我知道它可以在两个查询中完成,有没有一种方法可以在一个查询中完成?User.where id:posts.distinct.选择(:User_id)试试,如图所示: 或者,如果您已经有一个名为posts的实例

我有一个名为
User

class User < ActiveRecord::Base
   has_many: :posts
end
如果我有一个作用域posts对象(比如说
posts=Post.where(id:[1,2,3,4]

如何使用活动记录方法查询所有帖子的uniq用户


我知道它可以在两个查询中完成,有没有一种方法可以在一个查询中完成?

User.where id:posts.distinct.选择(:User_id)
试试,如图所示:

或者,如果您已经有一个名为
posts
的实例:

User.joins(:posts).where(posts: {id: posts})

通过考虑内部联接的工作方式,您可以使用一个查询,这将执行内部联接,并将仅返回至少有1篇文章的用户。此外,您希望对这些文章进行筛选,您可以使用ActiveRecord中的
merge
方法进行筛选。结果将是:

User.joins(:posts).merge(Post.where(id: [1,2,3,4]))

这将创建一个带有一些ruby处理的SQL查询

Post.eager_load(:user).where(id: [1,2,3,4]).map(&:user)

它会运行两个查询吗?一个用于
posts.distinct.select(:user\u id)
,一个用于
user.where id:[--results--]
当您使用
连接后可以直接访问
帖子
时,为什么要使用
合并
?虽然OP没有在问题中指定它,但这将阻止进一步查询生成的
用户
可枚举,因为它是一个
数组
,而不是某种类型的ActiveRecord可枚举。
User.joins(:posts).merge(Post.where(id: [1,2,3,4]))
Post.eager_load(:user).where(id: [1,2,3,4]).map(&:user)