Utiliser les fonctions SQL dans Active Record
La plupart des bases de données SQL proposent des fonctions pour extraire des parties d’une date. Par exemple, PostgreSQL utilise EXTRACT(DOW FROM date), où DOW signifie « day of the week » (jour de la semaine), et renvoie des valeurs de 0 (dimanche) à 6 (samedi).
Prenons un modèle Task avec une colonne created_at. Notre objectif est de récupérer uniquement les enregistrements créés en semaine. On va utiliser les capacités de requête d’Active Record pour y arriver.
# app/models/task.rb
class Task < ApplicationRecord
scope :weekdays_only, -> { where("EXTRACT(DOW FROM created_at) BETWEEN 1 AND 5") }
end
Explication :
-
EXTRACT(DOW FROM created_at): extrait le jour de la semaine du timestampcreated_at. -
BETWEEN 1 AND 5: limite la sélection du lundi au vendredi.
Utiliser les méthodes Date de Ruby avec Active Record
Si tu veux utiliser strictement les méthodes Date de Ruby, tu peux modifier le code pour filtrer les enregistrements après les avoir récupérés depuis la base de données, mais ce n’est pas efficace pour de gros jeux de données.
# app/models/task.rb
class Task < ApplicationRecord
def self.weekdays_only_ruby
all.select { |task| task.created_at.on_weekday? }
end
end
Explication :
- Cette méthode récupère d’abord tous les enregistrements de la base de données, puis les filtre avec la méthode Ruby
on_weekday?. -
task.created_at.on_weekday?: convertit le timestamp created_at en objet Date Ruby et vérifie s’il s’agit d’un jour de semaine (du lundi au vendredi).
Exemple d’utilisation :
Task.weekdays_only_ruby
Remarque : cette approche peut être peu efficace, car elle récupère d’abord tous les enregistrements de la base de données, puis les traite en mémoire. Elle est recommandée pour les petits jeux de données. Si tu travailles avec de gros volumes, la solution SQL sera bien plus efficace.
Combiner des conditions avec Active Record
Tu peux vouloir filtrer les enregistrements par jours de semaine et selon une condition précise, comme un statut. C’est possible en chaînant des scopes :
# app/models/task.rb
class Task < ApplicationRecord
scope :weekdays_only, -> { where.not("EXTRACT(DOW FROM created_at) IN (0, 6)") }
scope :completed, -> { where(status: 'completed') }
end
Exemple d’utilisation :
Task.weekdays_only.completed
Requêter sur différents fuseaux horaires
Quand tu travailles avec des fuseaux horaires, assure-toi que les timestamps created_at sont convertis correctement. Utilise la clause SQL AT TIME ZONE pour des comparaisons précises.
# app/models/task.rb
class Task < ApplicationRecord
scope :weekdays_only_in_timezone, ->(timezone) {
where("EXTRACT(DOW FROM created_at AT TIME ZONE ?) BETWEEN 1 AND 5", timezone)
}
end
Exemple d’utilisation :
Task.weekdays_only_in_timezone('UTC')
Gérer les autres bases de données
Selon la base de données SQL, les fonctions d’extraction de date peuvent varier :
- MySQL :
DAYOFWEEK(created_at) - SQLite :
strftime('%w', created_at)
Pense à adapter tes requêtes à la base de données utilisée :
# Example for MySQL
scope :weekdays_only, -> { where("DAYOFWEEK(created_at) BETWEEN 2 AND 6") }
Une fois ces scopes en place, la requête Task.weekdays_only renverra une collection de tâches créées uniquement en semaine. Voici un exemple :
tasks = Task.weekdays_only
tasks.each do |task|
puts task.created_at
end
Résultat :
2024-08-26 10:30:00 UTC # Monday
2024-08-27 11:45:00 UTC # Tuesday
2024-08-28 09:00:00 UTC # Wednesday
Conclusion
Filtrer les résultats Active Record pour ne garder que les jours de semaine est simple grâce aux fonctions SQL et aux méthodes Ruby qui extraient des parties d’une date.
D’autres articles qui pourraient te plaire :
- Comment extraire le total de jours, d’heures ou de minutes dans PostgreSQL
- Comment créer des graphiques avec Ruby on Rails
Beekeeper Studio est une interface de base de données gratuite & open source
Le meilleur outil de requêtes & éditeur SQL que j’aie jamais utilisé. Il m’offre tout ce dont j’ai besoin pour gérer ma base de données. - ⭐⭐⭐⭐⭐ Mit
Beekeeper Studio est rapide, intuitif et facile à utiliser. Beekeeper prend en charge plein de bases de données et fonctionne parfaitement sous Windows, Mac et Linux.
Ce que les utilisateurs disent de Beekeeper Studio
« Beekeeper Studio a complètement remplacé mon ancien workflow SQL. C’est rapide, intuitif, et ça rend le travail sur les bases de données à nouveau agréable. »
« J’ai essayé beaucoup d’interfaces de bases de données, mais Beekeeper trouve l’équilibre parfait entre fonctionnalités et simplicité. Ça marche, tout simplement. »