Obtenir la date la plus récente avec `maximum`
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éthodepluck
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.