Как найти записи, в которых ассоциации ассоциаций имеют только определенный статус - PullRequest
2 голосов
/ 06 мая 2020

Итак, у меня есть несколько сложная архитектура в новом микросервисе, и мне сложно понять, как мы можем выполнить этот запрос в синтаксисе 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')

сообщений, но мне нужны Авторы, у которых ВСЕ комментарии к их сообщениям имеют ТОЛЬКО статус:: модерирован

Возможно ли это?

1 Ответ

0 голосов
/ 06 мая 2020

Следующий запрос дает вам авторов, по крайней мере, с комментарием, который не модерируется:

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

Затем следующий запрос дает вам авторов, для которых все связанные комментарии связанных сообщений имеют статус moderated :

Author.where.not(id: bad_authors)

Обратите внимание, что это также возвращает авторов без комментариев (так как все их комментарии модерируются, пусто проверяет все). При необходимости запрос можно легко изменить, удалив авторов без комментариев.

Обратите внимание, что это вызывает единственный запрос (с подзапросом), даже если вы напишете его двумя частями. Вы можете использовать pluck вместо select в первом запросе для генерации двух запросов. Что более эффективно, зависит от используемой базы данных и имеющихся у вас индексов.

...