¿Cómo hago para que Rails tenga conteos de carga ansiosos?

Esto está relacionado con una preguntahace un año y cambia.

Puse un ejemplo de la pregunta que debería funcionar fuera de la caja, siempre que tenga sqlite3 disponible:https://github.com/cairo140/rails-eager-loading-counts-demo

Instrucciones de instalación (para la rama principal)
git clone git://github.com/cairo140/rails-eager-loading-counts-demo.git
cd rails-eager-loading-counts-demo
rails s

Tengo una redacción más completa en el repositorio, pero mi pregunta general es esta.

¿Cómo puedo hacer que Rails cuente la carga ansiosa de una manera que minimice las consultas db en todos los ámbitos?

losn+1 el problema surge cada vez que usa#count en una asociación, a pesar de haber incluido esa asociación a través de#includes(:associated) en la relación activa. Una solución es usar#length, pero esto funciona bien solo cuando el objeto al que está siendo llamado ya se ha cargado, sin mencionar que sospecho que duplica algo que los internos de Rails ya han hecho. Además, un problema con el uso#length es que da como resultado una sobrecarga desafortunada cuando la asociación no se cargó para empezar y el recuento es todo lo que necesita.

Del léame:

Podemos esquivar este problema ejecutando #length en la matriz de publicaciones (consulte el apéndice), que ya está cargado, pero sería bueno tener el recuento disponible también. No solo es más consistente; proporciona una ruta de acceso que no necesariamente requiere que se carguen las publicaciones. Por ejemplo, si tiene un parcial que muestra el recuento sin importar qué, pero la mitad del tiempo, el parcial se llama con publicaciones cargadas y la mitad del tiempo sin, se enfrenta al siguiente escenario:

Utilizando#countn COUNT consultas de estilo cuando las publicaciones ya están cargadasn COUNT consultas de estilo cuando las publicaciones aún no están cargadasUtilizando#lengthCero consultas adicionales cuando las publicaciones ya están cargadasn * consultas de estilo cuando las publicaciones aún no están cargadas

Entre estas dos opciones, no hay una opción dominante. Pero sería bueno revisar #count para diferir a #length o acceder a la longitud que de alguna otra manera se almacena detrás de escena para que podamos tener el siguiente escenario:

Utilizando revisado#countCero consultas adicionales cuando las publicaciones ya están cargadasn COUNT consultas de estilo cuando las publicaciones aún no están cargadas

Entonces, ¿cuál es el enfoque correcto aquí? ¿Hay algo que haya pasado por alto (muy, muy probable)?

Respuestas a la pregunta(4)

Su respuesta a la pregunta