No Rails, você pode encontrar o número de registros usando ambos Model.size
e Model.count
. Se você estiver lidando com consultas mais complexas, existe alguma vantagem em usar um método em detrimento do outro? Como eles são diferentes?
Por exemplo, tenho usuários com fotos. Se eu quiser mostrar uma tabela de usuários e quantas fotos eles tiverem, a execução de muitas instâncias user.photos.size
será mais rápida ou mais lenta do que user.photos.count
?
Obrigado!
size
adapta à situação de qualquer maneira, então qual é a necessidade paralength
ecount
em tudo?size
possa fazer uma ligação quando você fizer a ligação parasize
(depois que ela determinar para qual ligação).Comment.create(post_id: post.id)
, vocêpost.comments.size
não estará atualizado, enquantopost.comments.count
estará. Portanto, tenha cuidado.company.devices.build(:name => "device1"); company.devices.build(:name => "device2")
:,company.devices.size
e.length
incluirá o número de objetos que você criou, mas não salvou,.count
relatará apenas a contagem do banco de dados.Como as outras respostas afirmam:
count
irá executar umaCOUNT
consulta SQLlength
irá calcular o comprimento da matriz resultantesize
tentará escolher o mais apropriado para evitar consultas excessivasMas há mais uma coisa. Percebemos um caso em que
size
atua de maneira diferentecount
/length
e pensei em compartilhá-lo, pois é raro o suficiente para ser esquecido.Se você usar um
:counter_cache
em umahas_many
associação,size
usará a contagem em cache diretamente e não fará uma consulta extra.Esse comportamento está documentado nos Guias do Rails , mas eu o perdi pela primeira vez ou o esqueci.
fonte
_count
coluna (sem acounter_cache: true
diretiva sobre a associação). Isso foi corrigido no github.com/rails/rails/commit/e0cb21f5f7Às vezes
size
"escolhe o errado" e retorna um hash (que é ocount
que faria)Nesse caso, use
length
para obter um número inteiro em vez de hash .fonte
tl; dr
count
.length
.size
...contagem
Resolve enviar uma
Select count(*)...
consulta ao banco de dados. O caminho a percorrer se você não precisar dos dados, mas apenas a contagem.Exemplo: contagem de novas mensagens, total de elementos quando apenas uma página será exibida etc.
comprimento
Carrega os dados necessários, ou seja, a consulta conforme necessário e, em seguida, apenas conta. O caminho a percorrer se você estiver usando os dados.
Exemplo: Resumo de uma tabela totalmente carregada, títulos dos dados exibidos etc.
Tamanho
Ele verifica se os dados foram carregados (ou seja, já nos trilhos), se sim, e apenas conte, caso contrário, ele chama count. (mais as armadilhas, já mencionadas em outras entradas).
Qual é o problema?
Que você pode estar acessando o banco de dados duas vezes se não o fizer na ordem correta (por exemplo, se você renderizar o número de elementos em uma tabela em cima da tabela renderizada, efetivamente haverá 2 chamadas enviadas ao banco de dados).
fonte
Todas as estratégias a seguir fazem uma chamada ao banco de dados para executar uma
COUNT(*)
consulta.O seguinte não é tão eficiente quanto ele carregará todos os registros do banco de dados no Ruby, que conta o tamanho da coleção.
Se seus modelos têm associações e você deseja encontrar o número de objetos pertencentes (por exemplo
@customer.orders.size
), é possível evitar consultas ao banco de dados (leituras de disco). Use um cache de contador e o Rails manterá o valor do cache atualizado e retornará esse valor em resposta aosize
método.fonte
Model.all.size
eModel.all.count
geram umacount
consulta no Rails 4 e acima. A vantagem realsize
é que ela não gera a consulta de contagem se a associação já estiver carregada. No Rails 3 e abaixo, acredito queModel.all
não seja uma relação, portanto todos os registros já estão carregados. Esta resposta pode estar desatualizada e sugiro excluí-la.Eu recomendo usar a função de tamanho.
Considere estes dois modelos. O cliente possui muitas atividades.
Se você usar um: counter_cache em uma associação has_many, o tamanho usará a contagem em cache diretamente e não fará uma consulta extra.
Considere um exemplo: no meu banco de dados, um cliente possui 20.000 atividades e tento contar o número de registros de atividades desse cliente com cada método de contagem, comprimento e tamanho. aqui abaixo do relatório de referência de todos esses métodos.
então descobri que usar: counter_cache Size é a melhor opção para calcular o número de registros.
fonte