Пожалуйста, сообщите, как это вызывает N + 1 и как вы думаете, это решит проблему.Единственный способ увидеть ситуацию N + 1 - это если вы потом вызываете productupdates для каждого продукта.Если это так, то это не решит проблему.Пожалуйста, сообщите, чтобы другие могли сформулировать соответствующие ответы
В настоящее время я собираюсь предположить, что где-то позже в коде вы звоните productupdates
по отдельным продуктам.Если это так, то мы можем решить это без агрегирования следующим образом:
@products = Product.eager_load(:productupdates)
Теперь, когда мы зациклимся, обновления продукта уже загружены, так что, чтобы получить количество и максимум, мы можем сделать что-то вроде
@products.each do |p|
# COUNT
# (don't use the count method or it will execute a query )
p.productupdates.size
# MAX old_price
# older ruby versions use rails `try` instead
# e.g. p.productupdates.max_by(&:old_price).try(:old_price) || 0
p.productupdates.max_by(&:old_price)&.old_price || 0
end
Использование этих методов не приведет к выполнению дополнительных запросов, поскольку обновления продукта уже загружены
Примечание: Причина, по которой includes
не работает, заключается в том, что includes
будетиспользовать 2 запроса для извлечения данных (внешнее соединение sudo), если не выполняется одно из следующих условий:
- В предложении where используется условие поиска хеша, которое ссылается на таблицу ассоциации (например,
where(productupdates: {old_price: 12})
) - Вы включаете метод
references
(например, Product.includes(:productupdates).references(:productupdates)
)
В обоих этих случаях таблица будет оставлена объединенной.В этом случае я решил использовать энергичную нагрузку в качестве includes
делегатов на eager_load
в вышеупомянутых случаях в любом случае