1 min read

Obtenir la date la plus récente avec `maximum`

La méthode `ActiveRecord::Calculations#maximum` peut aussi servir à retrouver la date la plus récente parmi tout un ensemble.

Prenons par l’exemple suivant d’une application permettant de suivre les sessions de jeu de ses utilisateurs :

class User < ApplicationRecord
  has_many :game_sessions
end

class GameSession < ApplicationRecord
  belongs_to :user
end

Dans cette application, j’aimerais connaitre pour chaque utilisateur la date de sa dernière session de jeu.

Comme la seule donnée qui m’intéresse est la date de mise à jour de la dernière session de jeu et pas le reste des informations de cette dernière, je suis parti avec l’idée de trier mes sessions de jeux et de récupérer la date de mise à jour de la session de jeu ayant été mise à jour en dernier sans charger un objet entier.

class User < ApplicationRecord
  # …
  
  def last_played_at
    game_sessions.order(updated_at: :desc).pick(:updated_at)
  end
end
La méthode #pick fonctionne comme la méthode pluck mais ne retourne que le premier résultat de la liste.

Pourtant il existe une autre façon d’implémenter la méthode User#last_played_at, car ce qui m’intéresse réellement avec cette méthode, c’est de récupérer la date de mise à jour la plus grande (cad la plus récente) parmi toutes les dates de mise à jour des sessions de jeu d’un utilisateur.

Et c’est ici qu’intervient la méthode ActiveRecord::Calculations#maximum qui en plus d’améliorer la lisibilité du code, permet de comprendre d’un simple coup d’œil l’implémentation de la méthode User#last_played_at.

class User < ApplicationRecord
  # …
  
  def last_played_at
    game_sessions.maximum(:updated_at)
  end
end
Ne pas oublier de mettre en place un index au niveau de la base de donnée sur le champ updated_at, surtout sur des tables contenant de très nombreux enregistrements.

Pour aller plus loin