Старайтесь не запрашивать записи в Ruby вместо Active Record
Основная проблема с кодом, как он написан в настоящее время, заключается в том, что большая часть запросов выполняется с использованием Ruby, а не позволяет базе данных обрабатывать его через Active Record.
Как только вы использовали метод map
, вы сказали Active Record вернуть записи из базы данных и создать их экземпляр в памяти.
Путем написания всего запроса с использованием одной только Active Record вы достигнете гораздо большей производительности, избежите многократных запросов И код станет проще.
Использование joins
+ where
предложения
Ключом к вашему запросу является использование joins
для связи всех ассоциаций и where
для фильтрации их с теми, которые выхочу.
Начните с этого
current_user.orders.joins(:order_items)
Здесь вы можете использовать предложение where
для фильтрации по product_id
.
current_user.orders.joins(:order_items).where(order_items: { item_id: product_id })
where
Предложение может принимать Hash
в качестве параметра, и вы можете использовать этот хэш, чтобы указать, что вы хотите фильтровать в объединенной таблице (в данном случае в таблице order_items
).
Документация для этого здесь:
https://guides.rubyonrails.org/active_record_querying.html#specifying-conditions-on-the-joined-tables