← Retour aux Labs

Rails Performance

Ruby on Rails : size, count ou length ?

Trois méthodes qui semblent identiques, mais qui n’ont pas toujours le même comportement avec ActiveRecord.

users = User.where(active: true)

users.count
users.size
users.length

count

Interroge la base

users.count

# SELECT COUNT(*)
# FROM users
# WHERE active = true

count exécute une requête SQL COUNT(*) pour demander directement à la base de données combien de lignes correspondent.

Quand l’utiliser ?

Quand vous voulez explicitement compter en base de données, même si une collection est déjà chargée en mémoire.

size

Le choix intelligent

users.size

# Si relation non chargée :
# SELECT COUNT(*)

# Si relation déjà chargée :
# aucune requête SQL

size s’adapte au contexte : si la relation n’est pas chargée, Rails fait un COUNT(*). Si elle est déjà chargée, Rails utilise les objets en mémoire.

Quand l’utiliser ?

Dans la majorité des cas. C’est souvent le meilleur choix par défaut avec ActiveRecord.

length

Charge les objets

users.length

# SELECT *
# FROM users
# WHERE active = true

# Puis Ruby compte les objets

length force le chargement complet des enregistrements, puis compte les objets côté Ruby.

Quand l’utiliser ?

Rarement. Principalement lorsque la collection est déjà chargée ou que vous allez de toute façon parcourir tous les objets.

Comparatif

La différence en pratique.

Méthode
Requête SQL
Objets chargés
Recommandation
count
Oui, COUNT(*)
Non
Compter en base
size
Parfois
Oui si déjà chargé
Choix par défaut
length
Oui, SELECT *
Oui
Rarement nécessaire

La règle simple

size

À utiliser par défaut dans la majorité des cas.

count

À utiliser quand vous voulez forcer un COUNT(*) en base.

length

À utiliser seulement si la collection est déjà chargée.

Besoin d’aide sur Rails ?

Votre application Rails devient lente ou difficile à maintenir ?

J’accompagne les équipes sur l’audit, la performance PostgreSQL, Redis, Sidekiq, la refactorisation et l’architecture backend.