En Rails, puede encontrar el número de registros utilizando ambos Model.size
y 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.size
más rápido o más lento que user.photos.count
?
¡Gracias!
size
de todos modos se adapta a la situación, ¿qué necesidad hay paralength
ycount
en absoluto?size
pueda 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.size
no estará actualizado, mientras que lopost.comments.count
hará. Así que ten cuidado.company.devices.build(:name => "device1"); company.devices.build(:name => "device2")
y, a continuacióncompany.devices.size
e.length
incluirá el número de objetos que se ha construido, pero no ha guardado,.count
informará sólo el recuento de la base de datos.Como dicen las otras respuestas:
count
realizará unaCOUNT
consulta SQLlength
calculará la longitud de la matriz resultantesize
intentará elegir el más apropiado de los dos para evitar consultas excesivasPero hay una cosa más. Notamos un caso en el que
size
actúa de manera diferente acount
/ enlength
conjunto, y pensé en compartirlo ya que es bastante raro que se pase por alto.Si usa un
:counter_cache
en unahas_many
asociación,size
usará 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
_count
columna (sin lacounter_cache: true
directiva 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 locount
que haría)En ese caso, use
length
para 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 alsize
método.fuente
Model.all.size
yModel.all.count
generan unacount
consulta en Rails 4 y superiores. La verdadera ventaja desize
es que no genera la consulta de conteo si la asociación ya está cargada. En Rails 3 y versiones posteriores, creoModel.all
que 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