Если есть 25 клиентов, каждый с 10 счетами и 10 квитанциями, то использование 'where' with 'includes' сгенерирует SQL-запрос, подобный следующему:
select ...
from customers
left outer join invoices on invoices.customer_id = customers.id
left outer join receipts on receipts.customer_id = customers.id
where invoices.status = 'open'
Предполагая, что все счета открыты,этот запрос вернет 2500 строк, потому что левый запрос на внешнее объединение создаст все возможные комбинации таблиц клиентов, счетов-фактур и квитанций, что составляет 25 x 10 x 10. Вот как работают левые внешние объединения.
ActiveRecord будетзатем возьмите эти 2500 строк, объедините их все вместе и создайте значительно менее активные объекты записи.
В результирующих объектах активных записей каждая запись будет существовать только один раз.Например, в этом массиве @customers есть только 10 элементов:
@customers = Customer.all.includes(:invoices, :receipts).where(invoices: { status: "open" })
Кроме того, каждый счет и квитанция будут существовать только как одна запись, а не дублироваться много раз, как в строках, возвращаемыхзапрос.