¿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#count
n COUNT
consultas de estilo cuando las publicaciones ya están cargadasn COUNT
consultas de estilo cuando las publicaciones aún no están cargadasUtilizando#length
Cero consultas adicionales cuando las publicaciones ya están cargadasn *
consultas de estilo cuando las publicaciones aún no están cargadasEntre 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#count
Cero consultas adicionales cuando las publicaciones ya están cargadasn COUNT
consultas de estilo cuando las publicaciones aún no están cargadasEntonces, ¿cuál es el enfoque correcto aquí? ¿Hay algo que haya pasado por alto (muy, muy probable)?