En Rails, puede encontrar el número de registros utilizando ambos Model.sizey Model.count. Si se trata de consultas más complejas, ¿hay alguna ventaja en usar un método sobre el otro? ¿En qué se diferencian?
Por ejemplo, tengo usuarios con fotos. Si quiero mostrar una tabla de usuarios y cuántas fotos tienen, ¿se ejecutarán muchas instancias user.photos.sizemás rápido o más lento que user.photos.count?
¡Gracias!

sizede todos modos se adapta a la situación, ¿qué necesidad hay paralengthycounten absoluto?sizepueda hacer una llamada a ellos cuando realiza la llamadasize(después de que determina a quién llamar).Comment.create(post_id: post.id), supost.comments.sizeno estará actualizado, mientras que lopost.comments.counthará. Así que ten cuidado.company.devices.build(:name => "device1"); company.devices.build(:name => "device2")y, a continuacióncompany.devices.sizee.lengthincluirá el número de objetos que se ha construido, pero no ha guardado,.countinformará sólo el recuento de la base de datos.Como dicen las otras respuestas:
countrealizará unaCOUNTconsulta SQLlengthcalculará la longitud de la matriz resultantesizeintentará elegir el más apropiado de los dos para evitar consultas excesivasPero hay una cosa más. Notamos un caso en el que
sizeactúa de manera diferente acount/ enlengthconjunto, y pensé en compartirlo ya que es bastante raro que se pase por alto.Si usa un
:counter_cacheen unahas_manyasociación,sizeusará el recuento en caché directamente y no realizará ninguna consulta adicional.Este comportamiento está documentado en las Guías de Rails , pero lo perdí la primera vez o lo olvidé.
fuente
_countcolumna (sin lacounter_cache: truedirectiva sobre la asociación). Esto se ha solucionado en github.com/rails/rails/commit/e0cb21f5f7A veces
size"elige el incorrecto" y devuelve un hash (que es locountque haría)En ese caso, use
lengthpara obtener un número entero en lugar de hash .fuente
tl; dr
count.length.size...contar
Resuelve enviar una
Select count(*)...consulta a la base de datos. El camino a seguir si no necesita los datos, sino solo el recuento.Ejemplo: recuento de mensajes nuevos, elementos totales cuando solo se va a mostrar una página, etc.
longitud
Carga los datos requeridos, es decir, la consulta según sea necesario, y luego solo los cuenta. El camino a seguir si está utilizando los datos.
Ejemplo: resumen de una tabla completamente cargada, títulos de datos mostrados, etc.
Talla
Comprueba si los datos se cargaron (es decir, que ya están en rieles), de ser así, simplemente cuéntelos, de lo contrario, llama a contar. (más las trampas, ya mencionadas en otras entradas).
¿Cuál es el problema?
Es posible que esté golpeando la base de datos dos veces si no lo hace en el orden correcto (por ejemplo, si representa el número de elementos en una tabla encima de la tabla representada, efectivamente se enviarán 2 llamadas a la base de datos).
fuente
Todas las siguientes estrategias hacen una llamada a la base de datos para realizar una
COUNT(*)consulta.Lo siguiente no es tan eficiente, ya que cargará todos los registros de la base de datos en Ruby, que luego cuenta el tamaño de la colección.
Si sus modelos tienen asociaciones y desea encontrar el número de objetos pertenecientes (p
@customer.orders.size. Ej. ), Puede evitar consultas en la base de datos (lecturas de disco). Utilice un caché de contador y Rails mantendrá el valor de caché actualizado y devolverá ese valor en respuesta alsizemétodo.fuente
Model.all.sizeyModel.all.countgeneran unacountconsulta en Rails 4 y superiores. La verdadera ventaja desizees que no genera la consulta de conteo si la asociación ya está cargada. En Rails 3 y versiones posteriores, creoModel.allque no es una relación, por lo tanto, todos los registros ya están cargados. Esta respuesta puede estar desactualizada y sugiero eliminarla.Recomiendo usar la función de tamaño.
Considere estos dos modelos. El cliente tiene muchas actividades de clientes.
Si usa un: counter_cache en una asociación has_many, size usará el recuento en caché directamente y no realizará ninguna consulta adicional.
Considere un ejemplo: en mi base de datos, un cliente tiene 20,000 actividades de clientes e intento contar el número de registros de actividades de clientes de ese cliente con cada método de conteo, longitud y tamaño. aquí debajo el informe de referencia de todos estos métodos.
así que descubrí que usar: counter_cache Size es la mejor opción para calcular la cantidad de registros.
fuente