Rails запрашивает выбор родительской записи только там, где все ассоциации has_many имеют значение `true` - PullRequest
2 голосов
/ 10 ноября 2019
  • Книга has_many Страницы

  • Страница belongs_to Книга

  • Страница имеет логический атрибут read

Таким образом, идентификатор книги: 1 запись может иметь:

  • страница 1 с read true
  • страница 2 с read true
  • страница 3 с read false

А затем, идентификатор книги: 2:

  • страница 1 с read true
  • стр. 2 с read true

Таким образом, только идентификатор книги: 2 должен быть возвращен из запроса.

В настоящее время у меня есть:

Book.includes(:pages).where(pages: {read: true})

И он возвращает и Книгу id: 1 и id: 2.

Как это можно исправить?

1 Ответ

2 голосов
/ 10 ноября 2019

Предложение объединения не будет достаточным, потому что вам нужно проверить, что значение столбца read для каждого page дочернего элемента из родительской книги не ложно.

Вы можете явно добавить необходимыеиспользовать фильтр where:

Book.where.not(id: Page.where(read: false).select(:book_id))

Используя select в Page.where(read: false) Rails выполняет один запрос, например:

SELECT "books".*
FROM "books"
WHERE "books"."id" NOT IN (
  SELECT "pages"."book_id"
  FROM "pages"
  WHERE "pages"."read" = $1
) [["read", false]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...