Ваш первый подход выглядит правильно и как будто он должен работать.Я бы настроил его на «Railsy», как показано ниже:
Order.joins(book: :category).where(books: { categories: { id: 138 } })
Редактировать: На самом деле, говоря, что, если вы заранее знаете идентификатор своей категории, вы можетевообще пропустите загрузку категории следующим образом:
Order.joins(:book).where(books: { category_id: 138 })
Это будет намного эффективнее, чем второй подход, так как Rails оптимизирует запрос к базе данных, при этом вам не нужно будет хранить идентификаторы книг в памятизатем сделайте вторую транзакцию.
Если вы хотите получить доступ к атрибутам book
или вложенного category
заказа, вы должны переключить joins
на includes
- это предварительно загрузит все необходимых записей и позволяют вам получить доступ к их атрибутам без интенсивных и неэффективных запросов N + 1.
Это отвечает на ваш вопрос?У вас есть проблемы с этим подходом?Если вам нужно что-то прояснить, дайте мне знать, и я буду обновлять по мере необходимости.