Вы можете объединить таблицы с помощью Arel (я предпочитаю избегать написания необработанных SQL, когда это возможно).Я считаю, что для вашего примера вы бы сделали что-то вроде:
Customer.joins(:orders -> products).select("id, name, count(products.id) as count, sum(product.amount) as total_amount")
Первый метод -
Customer.joins(:orders -> products)
- извлекает вложенную ассоциацию в одном выражении.Затем вторая часть -
.select("id, name, count(products.id) as count, sum(product.amount) as total_amount")
- точно определяет, какие столбцы вы хотите вернуть.
Объедините их в цепочку, и я полагаю, что вы получите список экземпляров Customer, заполненных только тем, что выуказано в методе выбора.Вы должны быть осторожны, потому что теперь у вас есть в наличии только для чтения объекты, которые, возможно, находятся в недопустимом состоянии.
Как и во всех методах Arel, вы получаете из этих методов экземпляр ActiveRecord :: Relation.Только когда вы начинаете обращаться к этим данным, они выходят и выполняют SQL.
Я немного нервничаю из-за того, что мой синтаксис неверен, но я уверен, что это можно сделать, не полагаясь на выполнение необработанного SQL.