tl; dr
- Se você sabe que não precisará do uso de dados
count
.
- Se você sabe que irá usar ou usou os dados
length
.
- Se você não sabe o que está fazendo, use
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).
def size
loaded? ? @records.length : count(:all)
end
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).
size
adapta à situação de qualquer maneira, então qual é a necessidade paralength
ecount
em tudo?