首页 > 解决方案 > 如何查找关联的关联仅处于某种状态的记录

问题描述

所以我在一个新的微服务中有一个有点复杂的架构,我很难弄清楚我们如何在 Rails 6 ActiveRecord 语法中完成这个查询,而不是将模型拉入 Ruby。

查找关联帖子的关联评论都是状态的作者:“已审核”

Authors have many Posts
Posts are Commentable (polymorphic join)
(Authors are also Commentable (polymorphic join))

我能得到的最接近的是

Author.joins(posts: :comments)
      .where.not(comments: { status: :needs_moderated })
      .where(comments: { status: :moderated })
      .group('authors.id')

这让我得到了所有有帖子的作者,但我想要他们所有帖子的评论都是唯一状态的作者::moderated

这可能吗 ?

标签: ruby-on-railsrubypostgresqlactiverecordruby-on-rails-6

解决方案


以下查询为您提供了至少一个未经审核的评论的作者:

bad_authors = Author.joins(posts: :comments)
                    .where.not(comments: { status: :moderated })
                    .select(:id)

然后以下查询为您提供相关帖子的相关评论都是状态的作者moderated

Author.where.not(id: bad_authors)

请注意,这也会返回没有评论的作者(因为他们的所有评论都经过审核,空白验证一切)。如果需要,可以轻松修改查询以删除作者而不添加评论。

另请注意,即使您将其分为两部分,这也会引发单个查询(带有子查询)。您可以在第一个查询中使用pluck而不是select生成两个查询。什么更有效取决于您使用的数据库和您拥有的索引。


推荐阅读